12ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// (C) Copyright Gennadiy Rozental 2001-2008. 22ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Distributed under the Boost Software License, Version 1.0. 32ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// (See accompanying file LICENSE_1_0.txt or copy at 42ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// http://www.boost.org/LICENSE_1_0.txt) 52ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 62ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// See http://www.boost.org/libs/test for the library home page. 72ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 82ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// File : $RCSfile$ 92ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Version : $Revision: 54633 $ 112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Description : fixed sized mapping with specified invalid value 132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// *************************************************************************** 142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_TEST_FIXED_MAPPING_HPP_071894GER 162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_TEST_FIXED_MAPPING_HPP_071894GER 172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Boost 192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/repetition/repeat.hpp> 202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/arithmetic/add.hpp> 212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/call_traits.hpp> 222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/detail/binary_search.hpp> 232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// STL 252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <vector> 262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <functional> 272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <algorithm> 282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <utility> 292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/suppress_warnings.hpp> 312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________// 332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace boost { 352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace unit_test { 372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// configurable maximum fixed sized mapping size supported by this header. 392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// You can redefine it before inclusion of this file. 402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef MAX_MAP_SIZE 412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define MAX_MAP_SIZE 20 422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define CONSTR_DECL_MID( z, i, dummy1 ) key_param_type key##i, value_param_type v##i, 452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define CONSTR_BODY_MID( z, i, dummy1 ) add_pair( key##i, v##i ); 462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define CONSTR_DECL( z, n, dummy1 ) \ 482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh fixed_mapping( BOOST_PP_REPEAT_ ## z( n, CONSTR_DECL_MID, "" ) \ 492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh value_param_type invalid_value ) \ 502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : m_invalid_value( invalid_value ) \ 512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { \ 522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_REPEAT_ ## z( n, CONSTR_BODY_MID, "" ) \ 532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh init(); \ 542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } \ 552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define CONTRUCTORS( n ) BOOST_PP_REPEAT( n, CONSTR_DECL, "" ) 582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename Key, typename Value, typename Compare = std::less<Key> > 602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass fixed_mapping 612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef std::pair<Key,Value> elem_type; 632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef std::vector<elem_type> map_type; 642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename std::vector<elem_type>::const_iterator iterator; 652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename call_traits<Key>::param_type key_param_type; 672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename call_traits<Value>::param_type value_param_type; 682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename call_traits<Value>::const_reference value_ref_type; 692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) 712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct p1; friend struct p1; 722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct p2; friend struct p2; 732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // bind( Compare(), bind(select1st<elem_type>(), _1), bind(identity<Key>(), _2) ) 762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct p1 : public std::binary_function<elem_type,Key,bool> 772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh bool operator()( elem_type const& x, Key const& y ) const { return Compare()( x.first, y ); } 792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; 802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // bind( Compare(), bind(select1st<elem_type>(), _1), bind(select1st<elem_type>(), _2) ) 822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct p2 : public std::binary_function<elem_type,elem_type,bool> 832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh bool operator()( elem_type const& x, elem_type const& y ) const { return Compare()( x.first, y.first ); } 852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; 862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic: 882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Constructors 892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh CONTRUCTORS( BOOST_PP_ADD( MAX_MAP_SIZE, 1 ) ) 902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // key -> value access 922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh value_ref_type operator[]( key_param_type key ) const 932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh iterator it = boost::detail::lower_bound( m_map.begin(), m_map.end(), key, p1() ); 952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return (it == m_map.end() || Compare()( key, it->first ) ) ? m_invalid_value : it->second; 972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate: 1002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Implementation 1012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh void init() { std::sort( m_map.begin(), m_map.end(), p2() ); } 1022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh void add_pair( key_param_type key, value_param_type value ) { m_map.push_back( elem_type( key, value ) ); } 1032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Data members 1052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh Value m_invalid_value; 1062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh map_type m_map; 1072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 1082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace unit_test 1102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace boost 1122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________// 1142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/enable_warnings.hpp> 1162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#undef MAX_MAP_SIZE 1182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#undef CONSTR_DECL_MID 1192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#undef CONSTR_BODY_MID 1202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#undef CONSTR_DECL 1212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#undef CONTRUCTORS 1222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif // BOOST_TEST_FIXED_MAPPING_HPP_071894GER 1242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 125