The R Project SVN R-packages

Rev

Blame | Last modification | View Log | Download | RSS feed

#ifndef JSON_ALLOCATOR_H
#define JSON_ALLOCATOR_H

#include "JSONStats.h"
#if defined(JSON_MEMORY_CALLBACKS) || defined(JSON_MEMORY_POOL)

#include <cstddef>

//need these for the json_nothrow
#include "JSONDefs/Visual_C.h"
#include "JSONDefs/GNU_C.h"
#include "JSONDefs/Unknown_C.h"

class JSONAllocatorRelayer {
public:
    static void * alloc(size_t bytes) json_nothrow json_hot;
    static void dealloc(void * ptr) json_nothrow json_hot;
};

template <class T> class json_allocator;

// specialize for void:
template <> class json_allocator<void> {
public:
    typedef void*       pointer;
    typedef const void* const_pointer;
    // reference to void members are impossible.
    typedef void value_type;
    template <class U> struct rebind { typedef json_allocator<U> other; };
};

template <class T> class json_allocator {
public:
    typedef size_t    size_type;
    typedef ptrdiff_t difference_type;
    typedef T*        pointer;
    typedef const T*  const_pointer;
    typedef T&        reference;
    typedef const T&  const_reference;
    typedef T         value_type;
    template <class U> struct rebind { typedef json_allocator<U> other; };
    
    //LIBJSON_OBJECT(json_allocator);
    
    inline json_allocator() json_nothrow { 
        //LIBJSON_CTOR; 
    }
    inline json_allocator(const json_allocator&) json_nothrow { 
        //LIBJSON_COPY_CTOR; 
    }
    template <class U> inline json_allocator(const json_allocator<U>&) json_nothrow { 
        //LIBJSON_COPY_CTOR; 
    }
    inline ~json_allocator() json_nothrow { 
        //LIBJSON_DTOR; 
    }
    
    inline pointer address(reference x) const { return &x; }
    inline const_pointer address(const_reference x) const { return &x; }
    
    inline pointer allocate(size_type n, json_allocator<void>::const_pointer = 0) json_hot {
        return (pointer)JSONAllocatorRelayer::alloc(n * sizeof(T));
    }
    inline void deallocate(pointer p, size_type) json_hot {
        JSONAllocatorRelayer::dealloc(p);
    }
    
    inline size_type max_size() const json_nothrow { return 0xEFFFFFFF; }
    
    inline void construct(pointer p, const T& val){
        new(p)T(val);
    };
    inline void destroy(pointer p){
        ((T*)p) -> ~T();
    }
};

template <class T1, class T2> inline bool operator==(const json_allocator<T1>&, const json_allocator<T2>&) json_nothrow { return true; }
template <class T1, class T2> inline bool operator!=(const json_allocator<T1>&, const json_allocator<T2>&) json_nothrow { return false; }

#endif
#endif