native_allocator.hpp

Back to Native allocator

pastel/sys/allocator/native_allocator/

#ifndef PASTELSYS_NATIVE_ALLOCATOR_HPP
#define PASTELSYS_NATIVE_ALLOCATOR_HPP

#include "pastel/sys/allocator/native_allocator.h"
#include "pastel/sys/ensure.h"
#include "pastel/sys/generic/addressof.h"

namespace Pastel
{

    inline NativeAllocator::NativeAllocator(
        integer unitSize,
        bool isPodDataIgnored)
        : unitSize_(unitSize)
        , unitsAllocated_(0)
    {
        unused(isPodDataIgnored);

        ENSURE_OP(unitSize, >=, 0);
    }

    inline NativeAllocator::~NativeAllocator()
    {
        REPORT1(unitsAllocated_ != 0,
            unitsAllocated_);
    }

    inline bool NativeAllocator::operator==(
        const NativeAllocator& that) const
    {
        return this == &that;
    }

    inline bool NativeAllocator::operator<(
        const NativeAllocator& that) const
    {
        return this < &that;
    }

    inline void NativeAllocator::swap(NativeAllocator& that)
    {
        std::swap(unitSize_, that.unitSize_);
        std::swap(unitsAllocated_, that.unitsAllocated_);
    }

    inline void NativeAllocator::clear()
    {
    }

    inline integer NativeAllocator::unitSize() const
    {
        return unitSize_;
    }

    inline integer NativeAllocator::size() const
    {
        return unitsAllocated_;
    }

    inline integer NativeAllocator::capacity() const
    {
        return unitsAllocated_;
    }

    inline void* NativeAllocator::allocate()
    {
        void* memory = allocateRaw(unitSize_);

        ++unitsAllocated_;

        return memory;
    }

    inline void NativeAllocator::deallocate(const void* memAddress)
    {
        // Clearly a null pointer can't
        // be allocated from this allocator.

        ENSURE(memAddress);

        deallocateRaw(memAddress);

        --unitsAllocated_;
    }

    inline void swap(NativeAllocator& left,
        NativeAllocator& right)
    {
        left.swap(right);
    }

}

#endif