pastel/sys/allocator/native_allocator/
// Description: Native allocator
// Detail: An allocator wrapper for new and delete
#ifndef PASTELSYS_NATIVE_ALLOCATOR_H
#define PASTELSYS_NATIVE_ALLOCATOR_H
#include "pastel/sys/mytypes.h"
#include <boost/operators.hpp>
namespace Pastel
{
    //! A uniform allocator wrapper for new and delete.
    class NativeAllocator
        : boost::equality_comparable<
        NativeAllocator
        , boost::less_than_comparable<
        NativeAllocator
        > >
    {
    public:
        //! Constructs an allocator with the given 'unitSize'.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       The parameter 'isPodDataIgnored' has no meaning with
       this allocator.
       */
        explicit NativeAllocator(
            integer unitSize,
            bool isPodDataIgnored = false);
        //! Destructs the allocator.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        ~NativeAllocator();
        //! Compares two allocators.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       The comparison is done by memory addresses.
       */
        bool operator==(const NativeAllocator& that) const;
        //! Compares two allocators.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       The comparison is done by memory addresses.
       */
        bool operator<(const NativeAllocator& that) const;
        //! Swaps two allocators.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        void swap(NativeAllocator& that);
        //! A no-op.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        void clear();
        //! Returns the unit size.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        integer unitSize() const;
        //! Returns the amount of requested memory.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        integer size() const;
        //! Returns the actual amount of allocated memory.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        integer capacity() const;
        //! Allocates unitSize-sized memory area.
        /*!
       Time complexity: constant
       Exception safety: strong
       */
        void* allocate();
        //! Deallocates a previously allocated area.
        /*!
       Time complexity: constant
       Exception safety: nothrow
       */
        void deallocate(const void* memAddress);
    private:
        NativeAllocator(const NativeAllocator& that) = delete;
        NativeAllocator& operator=(const NativeAllocator& that) = delete;
        integer unitSize_;
        integer unitsAllocated_;
    };
    void swap(NativeAllocator& left, NativeAllocator& right);
}
#include "pastel/sys/allocator/native_allocator.hpp"
#endif