blob: dc55c1999502d54946a76d70fc53ac8e2b17d0b2 [file] [log] [blame]
/* Used in Boost.MultiIndex tests.
*
* Copyright 2003-2020 Joaquin M Lopez Munoz.
* 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)
*
* See http://www.boost.org/libs/multi_index for library home page.
*/
#ifndef BOOST_MULTI_INDEX_TEST_ROOTED_ALLOCATOR_HPP
#define BOOST_MULTI_INDEX_TEST_ROOTED_ALLOCATOR_HPP
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
#include <boost/type_traits/integral_constant.hpp>
#include <memory>
#if defined(BOOST_MSVC)
#pragma warning(push)
#pragma warning(disable:4355) /* this used in base member initializer list */
#endif
template<typename T,bool Propagate,bool AlwaysEqual>
class rooted_allocator:public std::allocator<T>
{
typedef boost::integral_constant<bool,Propagate> propagate_type;
typedef boost::integral_constant<bool,AlwaysEqual> always_equal_type;
public:
typedef propagate_type propagate_on_container_copy_assignment;
typedef propagate_type propagate_on_container_move_assignment;
typedef propagate_type propagate_on_container_swap;
typedef always_equal_type is_always_equal;
template<typename U>
struct rebind{typedef rooted_allocator<U,Propagate,AlwaysEqual> other;};
rooted_allocator():root(0){}
explicit rooted_allocator(int):root(this){}
template<typename U>
rooted_allocator(const rooted_allocator<U,Propagate,AlwaysEqual>& x):
root(x.root){}
template<typename U>
bool operator==(const rooted_allocator<U,Propagate,AlwaysEqual>& x)const
{return AlwaysEqual?true:root==x.root;}
template<typename U>
bool operator!=(const rooted_allocator<U,Propagate,AlwaysEqual>& x)const
{return !(*this==x);}
template<typename U>
bool comes_from(const rooted_allocator<U,Propagate,AlwaysEqual>& x)const
{return root==&x;}
private:
template<typename,bool,bool> friend class rooted_allocator;
const void* root;
};
#if defined(BOOST_MSVC)
#pragma warning(pop) /* C4355 */
#endif
#endif