// Copyright (c) 2016 The Chromium 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 NET_BASE_ARENA_H_ #define NET_BASE_ARENA_H_ #include #include #include "net/base/net_export.h" namespace net { // Allocates large blocks of memory, and doles them out in smaller chunks. // Not thread-safe. class NET_EXPORT_PRIVATE UnsafeArena { public: class Status { private: friend class UnsafeArena; size_t bytes_allocated_; public: Status() : bytes_allocated_(0) {} size_t bytes_allocated() const { return bytes_allocated_; } }; // Blocks allocated by this arena will be at least |block_size| bytes. explicit UnsafeArena(size_t block_size); ~UnsafeArena(); // Copy and assign are not allowed. UnsafeArena() = delete; UnsafeArena(const UnsafeArena&) = delete; UnsafeArena& operator=(const UnsafeArena&) = delete; // Move is allowed. UnsafeArena(UnsafeArena&& other); UnsafeArena& operator=(UnsafeArena&& other); char* Alloc(size_t size); char* Realloc(char* original, size_t oldsize, size_t newsize); char* Memdup(const char* data, size_t size); // If |data| and |size| describe the most recent allocation made from this // arena, the memory is reclaimed. Otherwise, this method is a no-op. void Free(char* data, size_t size); void Reset(); Status status() const { return status_; } private: struct Block { std::unique_ptr data; size_t size = 0; size_t used = 0; explicit Block(size_t s); ~Block(); Block(Block&& other); Block& operator=(Block&& other); }; void Reserve(size_t additional_space); void AllocBlock(size_t size); size_t block_size_; std::vector blocks_; Status status_; }; } // namespace net #endif // NET_BASE_ARENA_H_