
// Copyright 2006-2009 Daniel James.
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#if !defined(BOOST_UNORDERED_TEST_MALLOC_ALLOCATOR_HEADER)
#define BOOST_UNORDERED_TEST_MALLOC_ALLOCATOR_HEADER

#include <cstddef>
#include <cstdlib>
#include <boost/limits.hpp>
#include <new>

#if defined(BOOST_MSVC)
#pragma warning(push)
#pragma warning(disable:4100) // unreferenced formal parameter
#endif

namespace test
{
    template <class T>
    struct malloc_allocator
    {
        typedef std::size_t size_type;
        typedef std::ptrdiff_t difference_type;
        typedef T* pointer;
        typedef T const* const_pointer;
        typedef T& reference;
        typedef T const& const_reference;
        typedef T value_type;

        template <class U> struct rebind { typedef malloc_allocator<U> other; };

        malloc_allocator() {}
        template <class Y> malloc_allocator(malloc_allocator<Y> const&) {}
        malloc_allocator(malloc_allocator const&) {}

        pointer address(reference r) { return &r; }
        const_pointer address(const_reference r) { return &r; }

        pointer allocate(size_type n) {
            using namespace std;
            T* ptr = static_cast<T*>(malloc(n * sizeof(T)));
            if(!ptr) throw std::bad_alloc();
            return ptr;
        }

        pointer allocate(size_type n, void const* u) { return allocate(n); }

        void deallocate(pointer p, size_type) {
            using namespace std;
            free(p);
        }
        void construct(pointer p, T const& t) { new(p) T(t); }
        void destroy(pointer p) { p->~T(); }

        size_type max_size() const {
            return (std::numeric_limits<size_type>::max)();
        }

        bool operator==(malloc_allocator const&) const { return true; }
        bool operator!=(malloc_allocator const&) const { return false; }

#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
        template <class T> void deallocate(T* p, size_type) {
            using namespace std;
            free(p);
        }
        char* _Charalloc(size_type n) {
            using namespace std;
            T* ptr = static_cast<T*>(malloc(n * sizeof(char)));
            if(!ptr) throw std::bad_alloc();
            return (char*) ptr;
        }
#endif
    };
}

#if defined(BOOST_MSVC)
#pragma warning(pop)
#pragma warning(disable:4100) // unreferenced formal parameter
#endif

#endif
