intrusive/test/test_macros.hpp
Ion Gaztañaga 51de75799b - Implemented map and multimap-like interfaces.
-  Refactored hashtable containers to reduce template instantiations.
2015-06-04 11:16:21 +02:00

82 lines
2.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2006-2013
//
// 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/intrusive for documentation.
//
/////////////////////////////////////////////////////////////////////////////
#ifndef BOOST_INTRUSIVE_TEST_TEST_MACROS_HPP
#define BOOST_INTRUSIVE_TEST_TEST_MACROS_HPP
#include <boost/intrusive/intrusive_fwd.hpp>
#include <algorithm> //std::unique
namespace boost{
namespace intrusive{
namespace test{
template <class T>
struct is_multikey_true
{
typedef char yes_type;
template<bool IsMultikey>
struct two { yes_type _[1+IsMultikey]; };
template <class U> static yes_type test(...);
template <class U> static two<U::is_multikey>test(int);
static const bool value = sizeof(test<T>(0)) != sizeof(yes_type);
};
} //namespace test{
template<class It1, class It2>
bool test_equal(It1 f1, It1 l1, It2 f2)
{
while(f1 != l1){
if(*f1 != *f2){
return false;
}
++f1;
++f2;
}
return true;
}
#define TEST_INTRUSIVE_SEQUENCE( INTVALUES, ITERATOR )\
{ \
BOOST_TEST (boost::intrusive::test_equal(&INTVALUES[0], &INTVALUES[0] + sizeof(INTVALUES)/sizeof(INTVALUES[0]), ITERATOR) ); \
}
#define TEST_INTRUSIVE_SEQUENCE_EXPECTED( EXPECTEDVECTOR, ITERATOR )\
{ \
BOOST_TEST (boost::intrusive::test_equal(EXPECTEDVECTOR.begin(), EXPECTEDVECTOR.end(), ITERATOR) ); \
}
namespace test{
template<class Container, class Vector>
void test_intrusive_maybe_unique(const Container &c, Vector &v)
{
if(!is_multikey_true<Container>::value)
v.erase(std::unique(v.begin(), v.end()), v.end());
BOOST_TEST (boost::intrusive::test_equal(v.begin(), v.end(), c.begin()) );
}
} //namespace test{
#define TEST_INTRUSIVE_SEQUENCE_MAYBEUNIQUE(INTVALUES, CONTAINER)\
{\
boost::container::vector<int>v(&INTVALUES[0], &INTVALUES[0] + sizeof(INTVALUES)/sizeof(INTVALUES[0]));\
boost::intrusive::test::test_intrusive_maybe_unique(CONTAINER, v);\
}\
//
} //namespace boost{
} //namespace intrusive{
#endif