8#ifndef ADOBE_TABLE_INDEX_HPP
9#define ADOBE_TABLE_INDEX_HPP
19#include <boost/iterator/indirect_iterator.hpp>
20#include <boost/iterator/transform_iterator.hpp>
21#include <boost/next_prior.hpp>
22#include <boost/operators.hpp>
539 typename H = std::hash<T>,
540 typename C = std::equal_to<T>,
547 using key_type = std::remove_reference_t<adobe::invoke_result_t<P, T>>;
562 typedef boost::indirect_iterator<typename index_type::iterator>
iterator;
563 typedef boost::indirect_iterator<typename index_type::const_iterator>
const_iterator;
579 template <
typename F>
587 bool empty()
const {
return index_m.empty(); }
605 std::pair<typename index_type::iterator, bool> result = index_m.insert(&x);
606 return std::make_pair(
iterator(result.first), result.second);
609 template <
typename I>
639 std::pair<typename index_type::iterator, typename index_type::iterator> result =
640 index_m.equal_range(x);
644 std::pair<typename index_type::const_iterator, typename index_type::const_iterator> result =
645 index_m.equal_range(x);
662template <
typename Key,
664 typename Transform = mem_data_t<T, const Key>,
665 typename Compare = std::less<Key>
684 typedef boost::indirect_iterator<typename index_type::iterator>
iterator;
685 typedef boost::indirect_iterator<typename index_type::const_iterator>
const_iterator;
689 template <
class TransformPrimitive>
691 : transform_m(
transform), compare_m(compare) {}
702 template <
typename InputIterator,
typename TransformPrimitive>
705 : transform_m(
transform), compare_m(compare) {
737 template <
class InputIterator>
738 void insert(
iterator position, InputIterator first, InputIterator last);
777 swap(x.transform_m, y.transform_m);
778 swap(x.compare_m, y.compare_m);
779 swap(x.index_m, y.index_m);
783#ifndef ADOBE_NO_DOCUMENTATION
784 struct indirect_compare_t {
785 typedef bool result_type;
788 : transform_m(
transform), compare_m(compare) {}
791 return compare_m(transform_m(*x), transform_m(*y));
808template <
class Key,
class T,
class Compare,
class Transform>
811 : transform_m(
transform), compare_m(compare) {}
815template <
class Key,
class T,
class Compare,
class Transform>
823template <
class Key,
class T,
class Compare,
class Transform>
831template <
class Key,
class T,
class Compare,
class Transform>
839template <
class Key,
class T,
class Compare,
class Transform>
847template <
class Key,
class T,
class Compare,
class Transform>
855template <
class Key,
class T,
class Compare,
class Transform>
863template <
class Key,
class T,
class Compare,
class Transform>
871template <
class Key,
class T,
class Compare,
class Transform>
879template <
class Key,
class T,
class Compare,
class Transform>
882 return index_m.max_size();
887template <
class Key,
class T,
class Compare,
class Transform>
890 return index_m.size();
895template <
class Key,
class T,
class Compare,
class Transform>
897 return index_m.empty();
902template <
class Key,
class T,
class Compare,
class Transform>
904 index_m.push_back(&x);
909template <
class Key,
class T,
class Compare,
class Transform>
916template <
class Key,
class T,
class Compare,
class Transform>
919 return index_m.insert(position, &x);
929template <
class Key,
class T,
class Compare,
class Transform>
930template <
class InputIterator>
932 InputIterator last) {
933 typename index_type::iterator iter = position.base();
935 while (first != last) {
936 iter = index_m.insert(iter, &*first);
944template <
class Key,
class T,
class Compare,
class Transform>
947 return index_m.erase(position.base());
952template <
class Key,
class T,
class Compare,
class Transform>
955 return index_m.erase(first.base(), last.base());
960template <
class Key,
class T,
class Compare,
class Transform>
967template <
class Key,
class T,
class Compare,
class Transform>
969 adobe::sort(index_m, indirect_compare_t(transform_m, compare_m));
974template <
class Key,
class T,
class Compare,
class Transform>
976 typename index_type::iterator i(
977 adobe::unique(index_m, indirect_compare_t(transform_m, compare_m)));
978 index_m.erase(i, index_m.end());
983template <
class Key,
class T,
class Compare,
class Transform>
986 return *index_m.at(n);
991template <
class Key,
class T,
class Compare,
class Transform>
994 return *index_m.at(n);
999template <
class Key,
class T,
class Compare,
class Transform>
1005 throw std::range_error(
"Key not present in table.");
1012template <
class Key,
class T,
class Compare,
class Transform>
1018 throw std::range_error(
"Key not present in table.");
1025template <
class Key,
class T,
class Compare,
class Transform>
1028 typename index_type::iterator iter =
lower_bound(key).base();
1030 if (iter != index_m.end() && transform_m(**iter) != key)
1031 iter = index_m.end();
1038template <
class Key,
class T,
class Compare,
class Transform>
1041 typename index_type::const_iterator iter =
lower_bound(key).base();
1043 if (iter != index_m.end() && transform_m(**iter) != key)
1044 iter = index_m.end();
1051template <
class Key,
class T,
class Compare,
class Transform>
1054 return adobe::count_if(index_m, bound_predicate_t(key, transform_m, compare_m));
1059template <
class Key,
class T,
class Compare,
class Transform>
1063 index_m, key, compare_m,
1069template <
class Key,
class T,
class Compare,
class Transform>
1073 index_m, key, compare_m,
1079template <
class Key,
class T,
class Compare,
class Transform>
1083 index_m, key, compare_m,
1089template <
class Key,
class T,
class Compare,
class Transform>
1093 index_m, key, compare_m,
1099template <
class Key,
class T,
class Compare,
class Transform>
1100inline std::pair<typename table_index<Key, T, Compare, Transform>::iterator,
1104 index_m, key, compare_m,
1110template <
class Key,
class T,
class Compare,
class Transform>
1111inline std::pair<typename table_index<Key, T, Compare, Transform>::const_iterator,
1115 index_m, key, compare_m,
1121template <
class Key,
class T,
class Compare,
class Transform>
1129template <
class Key,
class T,
class Compare,
class Transform>
const_reverse_iterator rend() const
std::pair< const_iterator, const_iterator > equal_range(const key_type &x) const
const value_type * const_pointer
iterator erase(iterator i)
iterator find(const key_type &x)
const_iterator begin() const
size_type erase(const key_type &x)
hash_index(hasher hf, key_equal eq, F kf)
iterator upper_bound(const key_type &)
std::reverse_iterator< const_iterator > const_reverse_iterator
const index_type & index() const
const_iterator find(const key_type &x) const
hasher hash_function() const
boost::indirect_iterator< typename index_type::const_iterator > const_iterator
std::reverse_iterator< iterator > reverse_iterator
size_type max_size() const
iterator insert(iterator i, value_type &x)
unary_compose< key_function_type, indirect< value_type > > indirect_key_function_type
key_function_type key_function() const
friend void swap(hash_index &x, hash_index &y)
boost::indirect_iterator< typename index_type::iterator > iterator
const_iterator end() const
reverse_iterator rbegin()
size_type capacity() const
std::ptrdiff_t difference_type
const_iterator lower_bound(const key_type &) const
size_type count(const key_type &x) const
iterator lower_bound(const key_type &)
std::pair< iterator, iterator > equal_range(const key_type &x)
const_iterator upper_bound(const key_type &) const
std::pair< iterator, bool > insert(value_type &x)
closed_hash_set< pointer, indirect_key_function_type, hasher, key_equal > index_type
const_reverse_iterator rbegin() const
std::remove_reference_t< adobe::invoke_result_t< P, T > > key_type
const value_type & const_reference
index_type::size_type size_type
const_reference at(size_type n) const
const_reference front() const
friend void swap(table_index &x, table_index &y)
iterator erase(iterator location)
transform_type transform() const
iterator find(const key_type &x)
std::reverse_iterator< const_iterator > const_reverse_iterator
table_index(TransformPrimitive transform, const key_compare &compare=key_compare())
const_reference back() const
reference operator[](const key_type &)
std::pair< iterator, iterator > equal_range(const key_type &x)
boost::indirect_iterator< typename index_type::const_iterator > const_iterator
std::vector< T * > index_type
iterator upper_bound(const key_type &x)
std::reverse_iterator< iterator > reverse_iterator
iterator insert(iterator, value_type &)
reverse_iterator rbegin()
size_type count(const key_type &x) const
boost::indirect_iterator< typename index_type::iterator > iterator
iterator lower_bound(const key_type &x)
index_type::difference_type difference_type
table_index(InputIterator first, InputIterator last, TransformPrimitive transform, const key_compare &compare=key_compare())
size_type max_size() const
const T & const_reference
void push_back(value_type &)
A hash based associative container.
std::iterator_traits< InputIterator >::difference_type count_if(InputIterator first, InputIterator last, Predicate pred)
count implementation
std::pair< I, I > equal_range(I f, I l, const T &x)
boost::range_iterator< InputRange >::type find(InputRange &range, const T &value)
find implementation
unary_compose< F, G > compose(F f, G g)
void sort(RandomAccessRange &range)
sort implementation
auto unique(ForwardRange &range)
unique implementation
I upper_bound(I f, I l, const T &x)
I lower_bound(I f, I l, const T &x)