#ifndef KIMODEM_ARENA_H #define KIMODEM_ARENA_H #include #include #include #include namespace klib { enum ArenaType : uint8_t { ARENA_UNINIT, ARENA_STATIC, ARENA_ALLOC, ARENA_MMAP, }; class Arena { public: Arena(); ~Arena(); /* * InitializeArena is intended for use only with systems that * do not initialize new variables to zero. It should be called * exactly once, at the start of the program. Any other time the * arena needs to be reset, it should be called with Clear or * Destroy. */ void Initialize(); int SetStatic(uint8_t *, size_t); int SetAlloc(size_t allocSize); #if defined(__linux__) int MemoryMap(int fd); // Arena will own fd. int Create(const char *path, size_t size, mode_t mode); int Open(const char *, size_t); #endif uint8_t *NewCursor() const { return this->store; } uint8_t *End() { return this->store + this->size; } bool CursorInArena(uint8_t *cursor); size_t Size() const { return this->size; } uint8_t Type() const { return this->arenaType; } bool Ready() const { return this->Type() != ARENA_UNINIT; }; void Clear(); void Destroy(); /* dispose of any memory used by arena */ /* * DANGER: if arena is file backed (mmap or open), DO NOT WRITE TO THE * BACKING FILE! */ int Write(const char *path); uint8_t &operator[](size_t index) { return this->store[index]; } private: uint8_t *store; size_t size; int fd; ArenaType arenaType; }; std::ostream &operator<<(std::ostream& os, Arena arena); } // namespace klib #endif