// 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 #include #include "flutter/fml/mapping.h" #include "impeller/base/allocation_size.h" namespace impeller { //------------------------------------------------------------------------------ /// @brief Describes an allocation on the heap. /// /// Managing allocations through this utility makes it harder to /// miss allocation failures. /// class Allocation { public: //---------------------------------------------------------------------------- /// @brief Constructs a new zero-sized allocation. /// Allocation(); //---------------------------------------------------------------------------- /// @brief Destroys the allocation. /// ~Allocation(); //---------------------------------------------------------------------------- /// @brief Gets the pointer to the start of the allocation. /// /// This pointer is only valid till the next call to `Truncate`. /// /// @return The pointer to the start of the allocation. /// uint8_t* GetBuffer() const; //---------------------------------------------------------------------------- /// @brief Gets the length of the allocation. /// /// @return The length. /// Bytes GetLength() const; //---------------------------------------------------------------------------- /// @brief Gets the reserved length of the allocation. Calls to truncate /// may be ignored till the length exceeds the reserved length. /// /// @return The reserved length. /// Bytes GetReservedLength() const; //---------------------------------------------------------------------------- /// @brief Resize the underlying allocation to at least given number of /// bytes. /// /// In case of failure, false is returned and the underlying /// allocation remains unchanged. /// /// @warning Pointers to buffers obtained via previous calls to `GetBuffer` /// may become invalid at this point. /// /// @param[in] length The length. /// @param[in] npot Whether to round up the length to the next power of /// two. /// /// @return If the underlying allocation was resized to the new size. /// [[nodiscard]] bool Truncate(Bytes length, bool npot = true); //---------------------------------------------------------------------------- /// @brief Gets the next power of two size. /// /// @param[in] x The size. /// /// @return The next power of two of x. /// static uint32_t NextPowerOfTwoSize(uint32_t x); private: uint8_t* buffer_ = nullptr; Bytes length_; Bytes reserved_; [[nodiscard]] bool Reserve(Bytes reserved); [[nodiscard]] bool ReserveNPOT(Bytes reserved); Allocation(const Allocation&) = delete; Allocation& operator=(const Allocation&) = delete; }; //------------------------------------------------------------------------------ /// @brief Creates a mapping with copy of the bytes. /// /// @param[in] contents The contents /// @param[in] length The length /// /// @return The new mapping or nullptr if the copy could not be performed. /// std::shared_ptr CreateMappingWithCopy(const uint8_t* contents, Bytes length); //------------------------------------------------------------------------------ /// @brief Creates a mapping from allocation. /// /// No data copy occurs. Only a reference to the underlying /// allocation is bumped up. /// /// Changes to the underlying allocation will not be reflected in /// the mapping and must not change. /// /// @param[in] allocation The allocation. /// /// @return A new mapping or nullptr if the argument allocation was invalid. /// std::shared_ptr CreateMappingFromAllocation( const std::shared_ptr& allocation); //------------------------------------------------------------------------------ /// @brief Creates a mapping with string data. /// /// Only a reference to the underlying string is bumped up and the /// string is not copied. /// /// @param[in] string The string /// /// @return A new mapping or nullptr in case of allocation failures. /// std::shared_ptr CreateMappingWithString( std::shared_ptr string); //------------------------------------------------------------------------------ /// @brief Creates a mapping with string data. /// /// The string is copied. /// /// @param[in] string The string /// /// @return A new mapping or nullptr in case of allocation failures. /// std::shared_ptr CreateMappingWithString(std::string string); } // namespace impeller #endif // FLUTTER_IMPELLER_BASE_ALLOCATION_H_