19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file is part of the ustl library, an STL implementation. 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net> 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file is free software, distributed under the MIT License. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// memblock.h 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef MEMBLOCK_H_7ED63A891164CC43578E63664D52A196 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MEMBLOCK_H_7ED63A891164CC43578E63664D52A196 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "memlink.h" 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace ustl { 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// \class memblock memblock.h ustl.h 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// \ingroup MemoryManagement 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// \brief Allocated memory block. 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// Adds memory management capabilities to memlink. Uses malloc and realloc to 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// maintain the internal pointer, but only if allocated using members of this class, 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// or if linked to using the Manage() member function. Managed memory is automatically 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// freed in the destructor. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass memblock : public memlink { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const size_type c_PageSize = 64; ///< The default minimum allocation unit. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memblock (void); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memblock (const void* p, size_type n); 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project explicit memblock (size_type n); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project explicit memblock (const cmemlink& b); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project explicit memblock (const memlink& b); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memblock (const memblock& b); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~memblock (void); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void unlink (void); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline void assign (const cmemlink& l) { assign (l.cdata(), l.readable_size()); } 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline const memblock& operator= (const cmemlink& l) { assign (l); return (*this); } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline const memblock& operator= (const memlink& l) { assign (l); return (*this); } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline const memblock& operator= (const memblock& l) { assign (l); return (*this); } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void assign (const void* p, size_type n); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void swap (memblock& l); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reserve (size_type newSize, bool bExact = true); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void resize (size_type newSize, bool bExact = true); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iterator insert (iterator start, size_type size); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iterator erase (iterator start, size_type size); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline void clear (void) { resize (0); } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline bool is_linked (void) const { return (!m_Capacity && cdata()); } 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline size_type max_size (void) const { return (is_linked() ? memlink::max_size() : SIZE_MAX); } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline size_type capacity (void) const { return (m_Capacity); } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline void manage (memlink& l) { manage (l.begin(), l.size()); } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void deallocate (void) throw(); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void manage (void* p, size_type n); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void copy_link (void); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void read (istream& is); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void read_file (const char* filename); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline virtual size_type minimumFreeCapacity (void) const { return (0); } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_type m_Capacity; ///< Number of bytes allocated by Resize. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// Reads object \p l from stream \p is 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline istream& operator>> (istream& is, memblock& l) 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.read (is); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (is); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace ustl 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75