Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/test/utils/fixed_mapping.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/test/utils/fixed_mapping.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,124 @@ +// (C) Copyright Gennadiy Rozental 2001-2008. +// 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/test for the library home page. +// +// File : $RCSfile$ +// +// Version : $Revision: 54633 $ +// +// Description : fixed sized mapping with specified invalid value +// *************************************************************************** + +#ifndef BOOST_TEST_FIXED_MAPPING_HPP_071894GER +#define BOOST_TEST_FIXED_MAPPING_HPP_071894GER + +// Boost +#include <boost/preprocessor/repetition/repeat.hpp> +#include <boost/preprocessor/arithmetic/add.hpp> +#include <boost/call_traits.hpp> +#include <boost/detail/binary_search.hpp> + +// STL +#include <vector> +#include <functional> +#include <algorithm> +#include <utility> + +#include <boost/test/detail/suppress_warnings.hpp> + +//____________________________________________________________________________// + +namespace boost { + +namespace unit_test { + +// configurable maximum fixed sized mapping size supported by this header. +// You can redefine it before inclusion of this file. +#ifndef MAX_MAP_SIZE +#define MAX_MAP_SIZE 20 +#endif + +#define CONSTR_DECL_MID( z, i, dummy1 ) key_param_type key##i, value_param_type v##i, +#define CONSTR_BODY_MID( z, i, dummy1 ) add_pair( key##i, v##i ); + +#define CONSTR_DECL( z, n, dummy1 ) \ + fixed_mapping( BOOST_PP_REPEAT_ ## z( n, CONSTR_DECL_MID, "" ) \ + value_param_type invalid_value ) \ + : m_invalid_value( invalid_value ) \ + { \ + BOOST_PP_REPEAT_ ## z( n, CONSTR_BODY_MID, "" ) \ + init(); \ + } \ +/**/ + +#define CONTRUCTORS( n ) BOOST_PP_REPEAT( n, CONSTR_DECL, "" ) + +template<typename Key, typename Value, typename Compare = std::less<Key> > +class fixed_mapping +{ + typedef std::pair<Key,Value> elem_type; + typedef std::vector<elem_type> map_type; + typedef typename std::vector<elem_type>::const_iterator iterator; + + typedef typename call_traits<Key>::param_type key_param_type; + typedef typename call_traits<Value>::param_type value_param_type; + typedef typename call_traits<Value>::const_reference value_ref_type; + +#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) + struct p1; friend struct p1; + struct p2; friend struct p2; +#endif + + // bind( Compare(), bind(select1st<elem_type>(), _1), bind(identity<Key>(), _2) ) + struct p1 : public std::binary_function<elem_type,Key,bool> + { + bool operator()( elem_type const& x, Key const& y ) const { return Compare()( x.first, y ); } + }; + + // bind( Compare(), bind(select1st<elem_type>(), _1), bind(select1st<elem_type>(), _2) ) + struct p2 : public std::binary_function<elem_type,elem_type,bool> + { + bool operator()( elem_type const& x, elem_type const& y ) const { return Compare()( x.first, y.first ); } + }; + +public: + // Constructors + CONTRUCTORS( BOOST_PP_ADD( MAX_MAP_SIZE, 1 ) ) + + // key -> value access + value_ref_type operator[]( key_param_type key ) const + { + iterator it = boost::detail::lower_bound( m_map.begin(), m_map.end(), key, p1() ); + + return (it == m_map.end() || Compare()( key, it->first ) ) ? m_invalid_value : it->second; + } + +private: + // Implementation + void init() { std::sort( m_map.begin(), m_map.end(), p2() ); } + void add_pair( key_param_type key, value_param_type value ) { m_map.push_back( elem_type( key, value ) ); } + + // Data members + Value m_invalid_value; + map_type m_map; +}; + +} // namespace unit_test + +} // namespace boost + +//____________________________________________________________________________// + +#include <boost/test/detail/enable_warnings.hpp> + +#undef MAX_MAP_SIZE +#undef CONSTR_DECL_MID +#undef CONSTR_BODY_MID +#undef CONSTR_DECL +#undef CONTRUCTORS + +#endif // BOOST_TEST_FIXED_MAPPING_HPP_071894GER +