summaryrefslogtreecommitdiff
path: root/misc/uClibc++/include/uClibc++/associative_base
diff options
context:
space:
mode:
Diffstat (limited to 'misc/uClibc++/include/uClibc++/associative_base')
-rw-r--r--misc/uClibc++/include/uClibc++/associative_base1266
1 files changed, 696 insertions, 570 deletions
diff --git a/misc/uClibc++/include/uClibc++/associative_base b/misc/uClibc++/include/uClibc++/associative_base
index 27ae0ef9f..67122691b 100644
--- a/misc/uClibc++/include/uClibc++/associative_base
+++ b/misc/uClibc++/include/uClibc++/associative_base
@@ -1,47 +1,46 @@
-/* Copyright (C) 2007 Garrett A. Kajmowicz
- This file is part of the uClibc++ Library.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-
-
-#include<memory>
-#include<utility>
-#include<iterator>
-#include<functional>
-#include<list>
+/* Copyright (C) 2007 Garrett A. Kajmowicz
+ * This file is part of the uClibc++ Library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <memory>
+#include <utility>
+#include <iterator>
+#include <functional>
+#include <list>
#ifndef __STD_HEADER_ASSOCIATIVE_BASE
#define __STD_HEADER_ASSOCIATIVE_BASE
#pragma GCC visibility push(default)
-namespace std{
+extern "C++"
+{
+namespace std
+{
-/*
- * The basic premise here is that most of the code used by map, multimap, set and
- * multiset is really common. There are a number of interface additions, and
- * considerations about how to address multiple entries with the same key.
- * The goal is that the tree/storage code should be here, and managing
- * single or multiple counts will be left to subclasses.
- * Yes, inheritence for the purpose of code sharing is usually a bad idea.
- * However, since our goal is to reduce the total amount of code written
- * and the overall binary size, this seems to be the best approach possible.
+/* The basic premise here is that most of the code used by map, multimap, set and
+ * multiset is really common. There are a number of interface additions, and
+ * considerations about how to address multiple entries with the same key.
+ * The goal is that the tree/storage code should be here, and managing
+ * single or multiple counts will be left to subclasses.
+ * Yes, inheritence for the purpose of code sharing is usually a bad idea.
+ * However, since our goal is to reduce the total amount of code written
+ * and the overall binary size, this seems to be the best approach possible.
*/
template<class Key, class ValueType, class Compare = less<Key>, class Allocator = allocator<ValueType> > class __base_associative;
@@ -56,585 +55,712 @@ template<class Key, class ValueType, class Compare, class Allocator> class _UCXX
protected:
public:
- typedef Key key_type;
- typedef ValueType value_type;
- typedef Compare key_compare;
- typedef Allocator allocator_type;
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
- typedef typename Allocator::size_type size_type;
- typedef typename Allocator::difference_type difference_type;
- typedef typename Allocator::pointer pointer;
- typedef typename Allocator::const_pointer const_pointer;
- typedef __base_associative<Key, ValueType, Compare, Allocator> associative_type;
-
- typedef _associative_iter<value_type, Compare, Allocator> iterator;
- typedef _associative_citer<value_type, Compare, Allocator> const_iterator;
- typedef typename std::reverse_iterator<iterator> reverse_iterator;
- typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
-
-
- explicit __base_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
- : c(comp), value_to_key(v_to_k) { }
+ typedef Key key_type;
+ typedef ValueType value_type;
+ typedef Compare key_compare;
+ typedef Allocator allocator_type;
+ typedef typename Allocator::reference reference;
+ typedef typename Allocator::const_reference const_reference;
+ typedef typename Allocator::size_type size_type;
+ typedef typename Allocator::difference_type difference_type;
+ typedef typename Allocator::pointer pointer;
+ typedef typename Allocator::const_pointer const_pointer;
+ typedef __base_associative<Key, ValueType, Compare, Allocator> associative_type;
+
+ typedef _associative_iter<value_type, Compare, Allocator> iterator;
+ typedef _associative_citer<value_type, Compare, Allocator> const_iterator;
+ typedef typename std::reverse_iterator<iterator> reverse_iterator;
+ typedef typename std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+ explicit __base_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
+ : c(comp), value_to_key(v_to_k) { }
+
protected:
- __base_associative(const associative_type& x)
- : c(x.c), backing(x.backing), value_to_key(x.value_to_key) { }
+ __base_associative(const associative_type& x)
+ : c(x.c), backing(x.backing), value_to_key(x.value_to_key) { }
public:
- ~__base_associative(){
- }
-
- bool empty() const{
- return backing.empty();
- }
- size_type size() const{
- return backing.size();
- }
- size_type max_size() const{
- return backing.max_size();
- }
-
- iterator begin(){
- return iterator(backing.begin());
- }
-
- const_iterator begin() const{
- return const_iterator(backing.begin());
- }
-
- iterator end() {
- return iterator(backing.end());
- }
-
- const_iterator end() const{
- return const_iterator(backing.end());
- }
-
- reverse_iterator rbegin(){
- return reverse_iterator(end());
- }
-
- const_reverse_iterator rbegin() const{
- return const_reverse_iterator(end());
- }
-
- reverse_iterator rend(){
- return reverse_iterator(begin());
- }
-
- const_reverse_iterator rend() const{
- return const_reverse_iterator(begin());
- }
-
-
- iterator lower_bound(const key_type &x);
- const_iterator lower_bound(const key_type &x) const;
- iterator upper_bound(const key_type &x);
- const_iterator upper_bound(const key_type &x) const;
-
- pair<iterator,iterator> equal_range(const key_type& x){
- pair<iterator, iterator> retval;
- retval.first = lower_bound(x);
- retval.second = retval.first;
- while(retval.second != end() && !c(x, value_to_key(*retval.second))){
- ++retval.second;
- }
- return retval;
- }
- pair<const_iterator,const_iterator> equal_range(const key_type& x) const{
- pair<const_iterator, const_iterator> retval;
- retval.first = lower_bound(x);
- retval.second = retval.first;
- while(retval.second != end() && !c(x, value_to_key(*retval.second))){
- ++retval.second;
- }
- return retval;
- }
-
- iterator find(const key_type& x){
- iterator retval = lower_bound(x);
- if(retval == end()){
- return retval;
- }
- if(c(x, value_to_key(*retval))){
- return end();
- }
- return retval;
- }
- const_iterator find(const key_type& x) const{
- const_iterator retval = lower_bound(x);
- if(retval == end()){
- return retval;
- }
- if(c(x, value_to_key(*retval))){
- return end();
- }
- return retval;
- }
- size_type count(const key_type& x) const{
- size_type retval(0);
- const_iterator first = lower_bound(x);
- while(first != end() && !c(x, value_to_key(*first))){
- ++retval;
- ++first;
- }
- return retval;
- }
-
- void clear(){
- backing.clear();
- }
-
- void erase(iterator pos){
- backing.erase(pos.base_iterator());
- }
- size_type erase(const key_type& x){
- size_type count(0);
- iterator start = lower_bound(x);
- iterator end = upper_bound(x);
- while(start != end){
- start = backing.erase(start.base_iterator());
- ++count;
- }
- return count;
- }
- void erase(iterator first, iterator last){
- while(first != last){
- backing.erase(first.base_iterator());
- ++first;
- }
- }
-
- key_compare key_comp() const{
- return c;
- }
-
- __base_associative &operator=(const __base_associative & x){
- c = x.c;
- backing = x.backing;
- value_to_key = x.value_to_key;
- return *this;
- }
- bool operator==(const __base_associative & x){
- return x.backing == backing;
- }
- bool operator!=(const __base_associative & x){
- return !(x.backing == backing);
- }
+ ~__base_associative()
+ {
+ }
+
+ bool empty() const
+ {
+ return backing.empty();
+ }
+
+ size_type size() const
+ {
+ return backing.size();
+ }
+
+ size_type max_size() const
+ {
+ return backing.max_size();
+ }
+
+ iterator begin()
+ {
+ return iterator(backing.begin());
+ }
+
+ const_iterator begin() const
+ {
+ return const_iterator(backing.begin());
+ }
+
+ iterator end()
+ {
+ return iterator(backing.end());
+ }
+
+ const_iterator end() const
+ {
+ return const_iterator(backing.end());
+ }
+
+ reverse_iterator rbegin()
+ {
+ return reverse_iterator(end());
+ }
+
+ const_reverse_iterator rbegin() const
+ {
+ return const_reverse_iterator(end());
+ }
+
+ reverse_iterator rend()
+ {
+ return reverse_iterator(begin());
+ }
+
+ const_reverse_iterator rend() const
+ {
+ return const_reverse_iterator(begin());
+ }
+
+ iterator lower_bound(const key_type &x);
+ const_iterator lower_bound(const key_type &x) const;
+ iterator upper_bound(const key_type &x);
+ const_iterator upper_bound(const key_type &x) const;
+
+ pair<iterator,iterator> equal_range(const key_type& x)
+ {
+ pair<iterator, iterator> retval;
+ retval.first = lower_bound(x);
+ retval.second = retval.first;
+ while (retval.second != end() && !c(x, value_to_key(*retval.second)))
+ {
+ ++retval.second;
+ }
+
+ return retval;
+ }
+
+ pair<const_iterator,const_iterator> equal_range(const key_type& x) const
+ {
+ pair<const_iterator, const_iterator> retval;
+ retval.first = lower_bound(x);
+ retval.second = retval.first;
+ while (retval.second != end() && !c(x, value_to_key(*retval.second)))
+ {
+ ++retval.second;
+ }
+
+ return retval;
+ }
+
+ iterator find(const key_type& x)
+ {
+ iterator retval = lower_bound(x);
+ if (retval == end())
+ {
+ return retval;
+ }
+
+ if (c(x, value_to_key(*retval)))
+ {
+ return end();
+ }
+
+ return retval;
+ }
+
+ const_iterator find(const key_type& x) const
+ {
+ const_iterator retval = lower_bound(x);
+ if (retval == end())
+ {
+ return retval;
+ }
+
+ if (c(x, value_to_key(*retval)))
+ {
+ return end();
+ }
+
+ return retval;
+ }
+
+ size_type count(const key_type& x) const
+ {
+ size_type retval(0);
+ const_iterator first = lower_bound(x);
+ while (first != end() && !c(x, value_to_key(*first)))
+ {
+ ++retval;
+ ++first;
+ }
+
+ return retval;
+ }
+
+ void clear()
+ {
+ backing.clear();
+ }
+
+ void erase(iterator pos)
+ {
+ backing.erase(pos.base_iterator());
+ }
+
+ size_type erase(const key_type& x)
+ {
+ size_type count(0);
+ iterator start = lower_bound(x);
+ iterator end = upper_bound(x);
+ while (start != end)
+ {
+ start = backing.erase(start.base_iterator());
+ ++count;
+ }
+
+ return count;
+ }
+
+ void erase(iterator first, iterator last)
+ {
+ while (first != last)
+ {
+ backing.erase(first.base_iterator());
+ ++first;
+ }
+ }
+
+ key_compare key_comp() const
+ {
+ return c;
+ }
+
+ __base_associative &operator=(const __base_associative & x)
+ {
+ c = x.c;
+ backing = x.backing;
+ value_to_key = x.value_to_key;
+ return *this;
+ }
+
+ bool operator==(const __base_associative & x)
+ {
+ return x.backing == backing;
+ }
+
+ bool operator!=(const __base_associative & x)
+ {
+ return !(x.backing == backing);
+ }
protected:
- void swap(__base_associative & x);
-
- Compare c;
- std::list<value_type> backing;
+ void swap(__base_associative & x);
- const key_type (*value_to_key)(const value_type);
+ Compare c;
+ std::list<value_type> backing;
+ const key_type (*value_to_key)(const value_type);
};
-
-/*
- * Tree iterators for the base associative class
- */
+/* Tree iterators for the base associative class */
template<class ValueType, class Compare, class Allocator> class _associative_citer
- : public std::iterator<
- bidirectional_iterator_tag,
- ValueType,
- typename Allocator::difference_type,
- ValueType*,
- ValueType&
- >
+ : public std::iterator<
+ bidirectional_iterator_tag,
+ ValueType,
+ typename Allocator::difference_type,
+ ValueType*,
+ ValueType&
+ >
{
protected:
- typedef std::list<ValueType> listtype;
+ typedef std::list<ValueType> listtype;
+
+ typename listtype::const_iterator base_iter;
+ friend class _associative_iter<ValueType, Compare, Allocator>;
- typename listtype::const_iterator base_iter;
- friend class _associative_iter<ValueType, Compare, Allocator>;
public:
- _associative_citer() { }
- _associative_citer(const _associative_citer & m)
- : base_iter(m.base_iter) { }
- _associative_citer(const typename listtype::const_iterator & m)
- : base_iter(m) { }
- ~_associative_citer() { }
- ValueType operator*() const{
- return *base_iter;
- }
- const ValueType * operator->() const{
- return &(*base_iter);
- }
- _associative_citer & operator=(const _associative_citer & m){
- base_iter = m.base_iter;
- return *this;
- }
- bool operator==(const _associative_citer & m) const{
- return m.base_iter == base_iter;
- }
- bool operator!=(const _associative_citer & m) const{
- return m.base_iter != base_iter;
- }
- _associative_citer & operator++(){
- ++base_iter;
- return *this;
- }
- _associative_citer operator++(int){
- //The following approach ensures that we only need to
- //provide code for ++ in one place (above)
- _associative_citer temp(base_iter);
- ++base_iter;
- return temp;
- }
- _associative_citer & operator--(){
- --base_iter;
- return *this;
- }
- _associative_citer operator--(int){
- //The following approach ensures that we only need to
- //provide code for -- in one place (above)
- _associative_citer temp(base_iter);
- --base_iter;
- return temp;
- }
-
- //This is an implementation-defined function designed to make internals work correctly
- typename listtype::const_iterator base_iterator(){
- return base_iter;
- }
+ _associative_citer() { }
+ _associative_citer(const _associative_citer & m)
+ : base_iter(m.base_iter) { }
+ _associative_citer(const typename listtype::const_iterator & m)
+ : base_iter(m) { }
+ ~_associative_citer() { }
+
+ ValueType operator*() const
+ {
+ return *base_iter;
+ }
+
+ const ValueType * operator->() const
+ {
+ return &(*base_iter);
+ }
+
+ _associative_citer & operator=(const _associative_citer & m)
+ {
+ base_iter = m.base_iter;
+ return *this;
+ }
+
+ bool operator==(const _associative_citer & m) const
+ {
+ return m.base_iter == base_iter;
+ }
+
+ bool operator!=(const _associative_citer & m) const{
+ return m.base_iter != base_iter;
+ }
+
+ _associative_citer & operator++()
+ {
+ ++base_iter;
+ return *this;
+ }
+
+ _associative_citer operator++(int)
+ {
+ // The following approach ensures that we only need to
+ // provide code for ++ in one place (above)
+
+ _associative_citer temp(base_iter);
+ ++base_iter;
+ return temp;
+ }
+
+ _associative_citer & operator--()
+ {
+ --base_iter;
+ return *this;
+ }
+
+ _associative_citer operator--(int)
+ {
+ // The following approach ensures that we only need to
+ // provide code for -- in one place (above)
+
+ _associative_citer temp(base_iter);
+ --base_iter;
+ return temp;
+ }
+
+ // This is an implementation-defined function designed to make internals work correctly
+
+ typename listtype::const_iterator base_iterator()
+ {
+ return base_iter;
+ }
};
-
template<class ValueType, class Compare, class Allocator> class _associative_iter
- : public std::iterator<
- bidirectional_iterator_tag,
- ValueType,
- typename Allocator::difference_type,
- ValueType*,
- ValueType&
- >
+ : public std::iterator<
+ bidirectional_iterator_tag,
+ ValueType,
+ typename Allocator::difference_type,
+ ValueType*,
+ ValueType&
+ >
{
protected:
- typedef std::list<ValueType> listtype;
+ typedef std::list<ValueType> listtype;
- typename listtype::iterator base_iter;
- typedef _associative_citer<ValueType, Compare, Allocator> __associative_citer;
+ typename listtype::iterator base_iter;
+ typedef _associative_citer<ValueType, Compare, Allocator> __associative_citer;
public:
- _associative_iter() { }
- _associative_iter(const _associative_iter & m)
- : base_iter(m.base_iter) { }
- _associative_iter(const typename listtype::iterator & m)
- : base_iter(m) { }
- ~_associative_iter() { }
- const ValueType & operator*() const{
- return *base_iter;
- }
- ValueType & operator*(){
- return *base_iter;
- }
- ValueType * operator->(){
- return &(*base_iter);
- }
- const ValueType * operator->() const{
- return &(*base_iter);
- }
- _associative_iter & operator=(const _associative_iter & m){
- base_iter = m.base_iter;
- return *this;
- }
- bool operator==(const _associative_iter & m) const{
- return m.base_iter == base_iter;
- }
- bool operator==(const __associative_citer & m) const{
- return m.base_iter == base_iter;
- }
- bool operator!=(const _associative_iter & m) const{
- return m.base_iter != base_iter;
- }
- bool operator!=(const __associative_citer & m) const{
- return m.base_iter != base_iter;
- }
- _associative_iter & operator++(){
- ++base_iter;
- return *this;
- }
- _associative_iter operator++(int){
- //The following approach ensures that we only need to
- //provide code for ++ in one place (above)
- _associative_iter temp(base_iter);
- ++base_iter;
- return temp;
- }
- _associative_iter & operator--(){
- --base_iter;
- return *this;
- }
- _associative_iter operator--(int){
- //The following approach ensures that we only need to
- //provide code for -- in one place (above)
- _associative_iter temp(base_iter);
- --base_iter;
- return temp;
- }
- operator __associative_citer() const{
- return __associative_citer(base_iter);
- }
- typename listtype::iterator base_iterator(){
- return base_iter;
- }
- const typename listtype::iterator base_iterator() const{
- return base_iter;
- }
-
+ _associative_iter() { }
+ _associative_iter(const _associative_iter & m)
+ : base_iter(m.base_iter) { }
+ _associative_iter(const typename listtype::iterator & m)
+ : base_iter(m) { }
+ ~_associative_iter() { }
+
+ const ValueType & operator*() const
+ {
+ return *base_iter;
+ }
+
+ ValueType & operator*()
+ {
+ return *base_iter;
+ }
+
+ ValueType * operator->()
+ {
+ return &(*base_iter);
+ }
+
+ const ValueType * operator->() const
+ {
+ return &(*base_iter);
+ }
+
+ _associative_iter & operator=(const _associative_iter & m)
+ {
+ base_iter = m.base_iter;
+ return *this;
+ }
+
+ bool operator==(const _associative_iter & m) const
+ {
+ return m.base_iter == base_iter;
+ }
+
+ bool operator==(const __associative_citer & m) const
+ {
+ return m.base_iter == base_iter;
+ }
+
+ bool operator!=(const _associative_iter & m) const
+ {
+ return m.base_iter != base_iter;
+ }
+
+ bool operator!=(const __associative_citer & m) const
+ {
+ return m.base_iter != base_iter;
+ }
+
+ _associative_iter & operator++()
+ {
+ ++base_iter;
+ return *this;
+ }
+
+ _associative_iter operator++(int)
+ {
+ // The following approach ensures that we only need to
+ // provide code for ++ in one place (above)
+
+ _associative_iter temp(base_iter);
+ ++base_iter;
+ return temp;
+ }
+
+ _associative_iter & operator--()
+ {
+ --base_iter;
+ return *this;
+ }
+
+ _associative_iter operator--(int)
+ {
+ // The following approach ensures that we only need to
+ // provide code for -- in one place (above)
+
+ _associative_iter temp(base_iter);
+ --base_iter;
+ return temp;
+ }
+
+ operator __associative_citer() const
+ {
+ return __associative_citer(base_iter);
+ }
+
+ typename listtype::iterator base_iterator()
+ {
+ return base_iter;
+ }
+
+ const typename listtype::iterator base_iterator() const
+ {
+ return base_iter;
+ }
};
-
- // The lower_bound code is really crappy linear search. However, it is a dead
- // simple implementation (easy to audit). It can also be easily replaced.
-
-
- template <class Key, class ValueType, class Compare, class Allocator>
- typename __base_associative<Key, ValueType, Compare, Allocator>::iterator
- __base_associative<Key, ValueType, Compare, Allocator>::lower_bound(const key_type &x)
- {
- iterator retval = begin();
- while(retval != end() && c(value_to_key(*retval), x)){
- ++retval;
- }
- return retval;
- }
-
- template <class Key, class ValueType, class Compare, class Allocator>
- typename __base_associative<Key, ValueType, Compare, Allocator>::const_iterator
- __base_associative<Key, ValueType, Compare, Allocator>::lower_bound(const key_type &x) const
- {
- const_iterator retval = begin();
- while(retval != end() && c(value_to_key(*retval), x)){
- ++retval;
- }
- return retval;
- }
-
- // Upper bound search is linear from the point of lower_bound. This is likely the best solution
- // in all but the most pathological of cases.
-
- template <class Key, class ValueType, class Compare, class Allocator>
- typename __base_associative<Key, ValueType, Compare, Allocator>::iterator
- __base_associative<Key, ValueType, Compare, Allocator>::upper_bound(const key_type &x)
- {
- iterator retval = lower_bound(x);
- while(retval != end() && !c(x, value_to_key(*retval))){
- ++retval;
- }
- return retval;
- }
-
- template <class Key, class ValueType, class Compare, class Allocator>
- typename __base_associative<Key, ValueType, Compare, Allocator>::const_iterator
- __base_associative<Key, ValueType, Compare, Allocator>::upper_bound(const key_type &x) const
- {
- const_iterator retval = begin();
- while(retval != end() && !c(x, value_to_key(*retval))){
- ++retval;
- }
- return retval;
- }
-
-
- template <class Key, class ValueType, class Compare, class Allocator>
- void __base_associative<Key, ValueType, Compare, Allocator>::swap(__base_associative<Key, ValueType, Compare, Allocator>& m)
- {
- Compare n = c;
- c = m.c;
- m.c = n;
-
- m.backing.swap(backing);
- }
-
+ // The lower_bound code is really crappy linear search. However, it is a dead
+ // simple implementation (easy to audit). It can also be easily replaced.
+
+
+ template <class Key, class ValueType, class Compare, class Allocator>
+ typename __base_associative<Key, ValueType, Compare, Allocator>::iterator
+ __base_associative<Key, ValueType, Compare, Allocator>::lower_bound(const key_type &x)
+ {
+ iterator retval = begin();
+ while (retval != end() && c(value_to_key(*retval), x))
+ {
+ ++retval;
+ }
+
+ return retval;
+ }
+
+ template <class Key, class ValueType, class Compare, class Allocator>
+ typename __base_associative<Key, ValueType, Compare, Allocator>::const_iterator
+ __base_associative<Key, ValueType, Compare, Allocator>::lower_bound(const key_type &x) const
+ {
+ const_iterator retval = begin();
+ while (retval != end() && c(value_to_key(*retval), x))
+ {
+ ++retval;
+ }
+
+ return retval;
+ }
+
+ // Upper bound search is linear from the point of lower_bound. This is likely the best solution
+ // in all but the most pathological of cases.
+
+ template <class Key, class ValueType, class Compare, class Allocator>
+ typename __base_associative<Key, ValueType, Compare, Allocator>::iterator
+ __base_associative<Key, ValueType, Compare, Allocator>::upper_bound(const key_type &x)
+ {
+ iterator retval = lower_bound(x);
+ while (retval != end() && !c(x, value_to_key(*retval)))
+ {
+ ++retval;
+ }
+
+ return retval;
+ }
+
+ template <class Key, class ValueType, class Compare, class Allocator>
+ typename __base_associative<Key, ValueType, Compare, Allocator>::const_iterator
+ __base_associative<Key, ValueType, Compare, Allocator>::upper_bound(const key_type &x) const
+ {
+ const_iterator retval = begin();
+ while (retval != end() && !c(x, value_to_key(*retval)))
+ {
+ ++retval;
+ }
+
+ return retval;
+ }
+
+ template <class Key, class ValueType, class Compare, class Allocator>
+ void __base_associative<Key, ValueType, Compare, Allocator>::swap(__base_associative<Key, ValueType, Compare, Allocator>& m)
+ {
+ Compare n = c;
+ c = m.c;
+ m.c = n;
+
+ m.backing.swap(backing);
+ }
template<class Key, class ValueType, class Compare, class Allocator> class _UCXXEXPORT __single_associative :
- public __base_associative<Key, ValueType, Compare, Allocator>
+ public __base_associative<Key, ValueType, Compare, Allocator>
{
protected:
- typedef __base_associative<Key, ValueType, Compare, Allocator> base;
- using base::backing;
+ typedef __base_associative<Key, ValueType, Compare, Allocator> base;
+ using base::backing;
- using base::c;
+ using base::c;
public:
- typedef typename base::key_type key_type;
- typedef typename base::value_type value_type;
- typedef typename base::key_compare key_compare;
- typedef typename base::allocator_type allocator_type;
- typedef typename base::reference reference;
- typedef typename base::const_reference const_reference;
- typedef typename base::iterator iterator;
- typedef typename base::const_iterator const_iterator;
- typedef typename base::size_type size_type;
- typedef typename base::difference_type difference_type;
- typedef typename base::pointer pointer;
- typedef typename base::const_pointer const_pointer;
- typedef typename base::reverse_iterator reverse_iterator;
- typedef typename base::const_reverse_iterator const_reverse_iterator;
-
- using base::begin;
- using base::end;
- using base::rbegin;
- using base::rend;
-
- using base::empty;
- using base::size;
- using base::max_size;
-
- using base::find;
- using base::count;
- using base::lower_bound;
- using base::upper_bound;
- using base::equal_range;
-
- using base::operator=;
- using base::operator==;
- using base::operator!=;
-
- explicit __single_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
- : base(comp, A, v_to_k) { }
-
- template <class InputIterator> __single_associative(
- InputIterator first,
- InputIterator last,
- const Compare& comp,
- const Allocator& A,
- const key_type (*v_to_k)(const value_type)
- ) : base(comp, A, v_to_k) {
- insert(first, last);
- }
-
- pair<iterator, bool> insert(const value_type& x){
- pair<iterator, bool> retval;
- iterator location = lower_bound(this->value_to_key(x));
- retval.second = true;
- //Empty list or need to insert at end
- if(end() == location){
- backing.push_back(x);
- retval.first = --(end());
- return retval;
- }
- //Something in the list
- if(c(this->value_to_key(x), this->value_to_key(*location))){
- location = backing.insert(location.base_iterator(), x);
- retval.first = location;
- }else{
- retval.second = false;
- retval.first = location;
- }
- return retval;
- }
-
- iterator insert(iterator position, const value_type& x){
- // FIXME - this is cheating and probably should be more efficient since we are
- // now log(n) to find for inserts
- return insert(x).first;
- }
-
- template <class InputIterator> void insert(InputIterator first, InputIterator last){
- while(first != last){
- insert(*first);
- ++first;
- }
- }
-
+ typedef typename base::key_type key_type;
+ typedef typename base::value_type value_type;
+ typedef typename base::key_compare key_compare;
+ typedef typename base::allocator_type allocator_type;
+ typedef typename base::reference reference;
+ typedef typename base::const_reference const_reference;
+ typedef typename base::iterator iterator;
+ typedef typename base::const_iterator const_iterator;
+ typedef typename base::size_type size_type;
+ typedef typename base::difference_type difference_type;
+ typedef typename base::pointer pointer;
+ typedef typename base::const_pointer const_pointer;
+ typedef typename base::reverse_iterator reverse_iterator;
+ typedef typename base::const_reverse_iterator const_reverse_iterator;
+
+ using base::begin;
+ using base::end;
+ using base::rbegin;
+ using base::rend;
+
+ using base::empty;
+ using base::size;
+ using base::max_size;
+
+ using base::find;
+ using base::count;
+ using base::lower_bound;
+ using base::upper_bound;
+ using base::equal_range;
+
+ using base::operator=;
+ using base::operator==;
+ using base::operator!=;
+
+ explicit __single_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
+ : base(comp, A, v_to_k) { }
+
+ template <class InputIterator> __single_associative(
+ InputIterator first,
+ InputIterator last,
+ const Compare& comp,
+ const Allocator& A,
+ const key_type (*v_to_k)(const value_type)
+ ) : base(comp, A, v_to_k)
+ {
+ insert(first, last);
+ }
+
+ pair<iterator, bool> insert(const value_type& x)
+ {
+ pair<iterator, bool> retval;
+ iterator location = lower_bound(this->value_to_key(x));
+ retval.second = true;
+
+ // Empty list or need to insert at end
+
+ if (end() == location)
+ {
+ backing.push_back(x);
+ retval.first = --(end());
+ return retval;
+ }
+
+ // Something in the list
+
+ if (c(this->value_to_key(x), this->value_to_key(*location)))
+ {
+ location = backing.insert(location.base_iterator(), x);
+ retval.first = location;
+ }
+ else
+ {
+ retval.second = false;
+ retval.first = location;
+ }
+
+ return retval;
+ }
+
+ iterator insert(iterator position, const value_type& x)
+ {
+ // FIXME - this is cheating and probably should be more efficient since we are
+ // now log(n) to find for inserts
+
+ return insert(x).first;
+ }
+
+ template <class InputIterator> void insert(InputIterator first, InputIterator last)
+ {
+ while (first != last)
+ {
+ insert(*first);
+ ++first;
+ }
+ }
};
template<class Key, class ValueType, class Compare, class Allocator> class _UCXXEXPORT __multi_associative :
- public __base_associative<Key, ValueType, Compare, Allocator>
+ public __base_associative<Key, ValueType, Compare, Allocator>
{
protected:
- typedef __base_associative<Key, ValueType, Compare, Allocator> base;
- using base::backing;
+ typedef __base_associative<Key, ValueType, Compare, Allocator> base;
+ using base::backing;
- using base::c;
+ using base::c;
public:
- typedef typename base::key_type key_type;
- typedef typename base::value_type value_type;
- typedef typename base::key_compare key_compare;
- typedef typename base::allocator_type allocator_type;
- typedef typename base::reference reference;
- typedef typename base::const_reference const_reference;
- typedef typename base::iterator iterator;
- typedef typename base::const_iterator const_iterator;
- typedef typename base::size_type size_type;
- typedef typename base::difference_type difference_type;
- typedef typename base::pointer pointer;
- typedef typename base::const_pointer const_pointer;
- typedef typename base::reverse_iterator reverse_iterator;
- typedef typename base::const_reverse_iterator const_reverse_iterator;
-
- using base::begin;
- using base::end;
- using base::rbegin;
- using base::rend;
-
- using base::empty;
- using base::size;
- using base::max_size;
-
- using base::find;
- using base::count;
- using base::lower_bound;
- using base::upper_bound;
- using base::equal_range;
-
- using base::operator=;
- using base::operator==;
-
-
- explicit __multi_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
- : base(comp, A, v_to_k) { }
-
- template <class InputIterator> __multi_associative(
- InputIterator first,
- InputIterator last,
- const Compare& comp,
- const Allocator& A,
- const key_type (*v_to_k)(const value_type)
- ) : base(comp, A, v_to_k) {
- insert(first, last);
- }
-
- iterator insert(const value_type& x){
- iterator location = lower_bound(this->value_to_key(x));
-
- if(location == begin()){
- backing.push_front(x);
- location = begin();
- }else{
- location = backing.insert(location.base_iterator(), x);
- }
- return location;
- }
-
- iterator insert(iterator position, const value_type& x){
- // FIXME - this is cheating and probably should be more efficient since we are
- // now log(n) to find for inserts
- return insert(x);
- }
-
- template <class InputIterator> void insert(InputIterator first, InputIterator last){
- while(first != last){
- insert(*first);
- ++first;
- }
- }
+ typedef typename base::key_type key_type;
+ typedef typename base::value_type value_type;
+ typedef typename base::key_compare key_compare;
+ typedef typename base::allocator_type allocator_type;
+ typedef typename base::reference reference;
+ typedef typename base::const_reference const_reference;
+ typedef typename base::iterator iterator;
+ typedef typename base::const_iterator const_iterator;
+ typedef typename base::size_type size_type;
+ typedef typename base::difference_type difference_type;
+ typedef typename base::pointer pointer;
+ typedef typename base::const_pointer const_pointer;
+ typedef typename base::reverse_iterator reverse_iterator;
+ typedef typename base::const_reverse_iterator const_reverse_iterator;
+
+ using base::begin;
+ using base::end;
+ using base::rbegin;
+ using base::rend;
+
+ using base::empty;
+ using base::size;
+ using base::max_size;
+
+ using base::find;
+ using base::count;
+ using base::lower_bound;
+ using base::upper_bound;
+ using base::equal_range;
+
+ using base::operator=;
+ using base::operator==;
+
+
+ explicit __multi_associative(const Compare& comp, const Allocator& A, const key_type (*v_to_k)(const value_type))
+ : base(comp, A, v_to_k) { }
+
+ template <class InputIterator> __multi_associative(
+ InputIterator first,
+ InputIterator last,
+ const Compare& comp,
+ const Allocator& A,
+ const key_type (*v_to_k)(const value_type)
+ ) : base(comp, A, v_to_k)
+ {
+ insert(first, last);
+ }
+
+ iterator insert(const value_type& x)
+ {
+ iterator location = lower_bound(this->value_to_key(x));
+
+ if (location == begin())
+ {
+ backing.push_front(x);
+ location = begin();
+ }
+ else
+ {
+ location = backing.insert(location.base_iterator(), x);
+ }
+
+ return location;
+ }
+
+ iterator insert(iterator position, const value_type& x)
+ {
+ // FIXME - this is cheating and probably should be more efficient since we are
+ // now log(n) to find for inserts
+
+ return insert(x);
+ }
+
+ template <class InputIterator> void insert(InputIterator first, InputIterator last)
+ {
+ while (first != last)
+ {
+ insert(*first);
+ ++first;
+ }
+ }
};
-
-
-
-}
+} // namespace
+} // extern "C++"
#pragma GCC visibility pop
-#endif //__STD_HEADER_ASSOCIATIVE_BASE
+#endif //__STD_HEADER_ASSOCIATIVE_BASE