// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_IMPELLER_BASE_ALLOCATION_H_
#define FLUTTER_IMPELLER_BASE_ALLOCATION_H_

#include <cstdint>
#include <memory>

#include "flutter/fml/mapping.h"

namespace impeller {

class Allocation {
 public:
  Allocation();

  ~Allocation();

  uint8_t* GetBuffer() const;

  size_t GetLength() const;

  size_t GetReservedLength() const;

  [[nodiscard]] bool Truncate(size_t length, bool npot = true);

  static uint32_t NextPowerOfTwoSize(uint32_t x);

 private:
  uint8_t* buffer_ = nullptr;
  size_t length_ = 0;
  size_t reserved_ = 0;

  [[nodiscard]] bool Reserve(size_t reserved);

  [[nodiscard]] bool ReserveNPOT(size_t reserved);

  Allocation(const Allocation&) = delete;

  Allocation& operator=(const Allocation&) = delete;
};

std::shared_ptr<fml::Mapping> CreateMappingWithCopy(const uint8_t* contents,
                                                    size_t length);

std::shared_ptr<fml::Mapping> CreateMappingFromAllocation(
    const std::shared_ptr<Allocation>& allocation);

std::shared_ptr<fml::Mapping> CreateMappingWithString(
    std::shared_ptr<const std::string> string);

std::shared_ptr<fml::Mapping> CreateMappingWithString(std::string string);

}  // namespace impeller

#endif  // FLUTTER_IMPELLER_BASE_ALLOCATION_H_
