33 #ifndef SHARK_CORE_KEY_VALUE_PAIR_H 34 #define SHARK_CORE_KEY_VALUE_PAIR_H 38 #include <boost/operators.hpp> 46 template<
class Key,
class Value>
48 :boost::partially_ordered<KeyValuePair<Key,Value> >{
54 :key(key),value(value){}
58 :key(pair.key),value(pair.value){}
60 template<
class K,
class V>
62 return key == pair.
key;
64 template<
class K,
class V>
65 bool operator<(KeyValuePair<K,V>
const& pair)
const{
71 template<
class K,
class V>
79 template<
class Key,
class Value>
88 template<
class Key,
class Value,
class KeyIterator,
class ValueIterator>
89 struct PairReference<KeyValuePair<Key,Value>, KeyIterator, ValueIterator >{
91 typedef typename boost::iterator_reference<KeyIterator>::type KeyReference;
92 typedef typename boost::iterator_reference<ValueIterator>::type ValueReference;
96 :boost::partially_ordered<type,ReferedType >{
105 template<
class K,
class V>
110 template<
class Reference>
111 type& operator=(Reference
const& pair){
116 type& operator=(type
const& pair){
124 return key == pair.key;
128 return key < pair.key;
131 operator ReferedType()
const{
132 return ReferedType(key,value);
135 friend void swap(type a, type b){
138 swap(a.value,b.value);
150 public boost::iterator_range<
153 typename boost::iterator_value<Iterator1>::type,
154 typename boost::iterator_value<Iterator2>::type
159 typedef KeyValuePair<
160 typename boost::iterator_value<Iterator1>::type,
161 typename boost::iterator_value<Iterator2>::type
164 typedef boost::iterator_range<iterator> base_type;
166 template<
class Range1,
class Range2>
170 KeyValueRange(Iterator1 begin1, Iterator1 end1, Iterator2 begin2, Iterator2 end2)
171 :base_type(
zipPairRange<value_type>(begin1, end1, begin2, end2)){}
182 template<
class Iterator1,
class Iterator2>
193 template<
class Range1,
class Range2>
195 typename boost::range_iterator<Range1>::type,
196 typename boost::range_iterator<Range2>::type
200 typename boost::range_iterator<Range1>::type,
201 typename boost::range_iterator<Range2>::type>(range1,range2);