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