source: source/ariba/overlay/modules/chord/detail/minimizer_table.hpp@ 3690

Last change on this file since 3690 was 3690, checked in by mies, 16 years ago

Merged 20090512-mies-connectors changes r3472:r3689 into trunk.

File size: 4.8 KB
Line 
1// [License]
2// The Ariba-Underlay Copyright
3//
4// Copyright (c) 2008-2009, Institute of Telematics, UniversitÀt Karlsruhe (TH)
5//
6// Institute of Telematics
7// UniversitÀt Karlsruhe (TH)
8// Zirkel 2, 76128 Karlsruhe
9// Germany
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
22// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OF TELEMATICS OR
25// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32//
33// The views and conclusions contained in the software and documentation
34// are those of the authors and should not be interpreted as representing
35// official policies, either expressed or implied, of the Institute of
36// Telematics.
37// [License]
38#ifndef MINIMIZER_TABLE_HPP_
39#define MINIMIZER_TABLE_HPP_
40
41#include <vector>
42#include <iostream>
43#include "table_listener.hpp"
44
45using std::vector;
46using std::ostream;
47
48/**
49 * TODO: Doc
50 *
51 * @author Sebastian Mies <mies@tm.uka.de>
52 */
53template<class Value, class Comparator, typename Listener = table_listener>
54class minimizer_table: public vector<Value> {
55private:
56 // define table type
57 typedef vector<Value> super;
58
59 // members
60 size_t max_size;
61 Comparator compare;
62
63 // listener
64 Listener& listener;
65
66public:
67
68 /// delegates from vector<Value>
69 typedef typename super::iterator iterator;
70
71 /// delegates from vector<Value>
72 typedef typename super::const_iterator const_iterator;
73
74 /// explicitly construct a minimizer table
75 explicit minimizer_table(size_t max_size, Comparator compare = Comparator(),
76 Listener& listener = Listener::DEFAULT) :
77 super(), max_size(max_size), compare(compare), listener(listener) {
78 }
79
80 /// returns true, if the value would fit into the table
81 bool insertable( const Value& value ) {
82 return insert(value,true) != super::end();
83 }
84
85 /// inserts a value into an ordered list
86 iterator insert(const Value& value, bool simulate = false ) {
87 iterator iter = super::end();
88
89 // table empty? -> just add entry
90 if (super::size() == 0) {
91 if (!simulate) super::push_back(value);
92 iter = super::end()-1;
93 if (!simulate) listener.on_table( table_listener::insert, *this, iter );
94 } else
95
96 // add at correct position
97 for (iterator i = super::begin(); i != super::end(); i++) {
98 int cmp = compare(value, *i);
99 if (cmp < 0) {
100 if (!simulate) {
101 iter = super::insert(i, value);
102 } else
103 iter = i;
104 if (!simulate)
105 listener.on_table( table_listener::insert, *this, iter );
106 break;
107 } else
108 if (cmp == 0) return iter;
109 }
110
111 // no item smaller than item and table not full? -> append
112 if (iter == super::end() && super::size() != max_size) {
113 if (!simulate)
114 super::push_back(value);
115 iter = super::end()-1;
116 if (!simulate) listener.on_table( table_listener::insert, *this, iter );
117
118 } else
119
120 // drop entries
121 if (super::size() > max_size) {
122 if (!simulate) {
123 listener.on_table( table_listener::remove, *this, super::end()-1 );
124 super::pop_back();
125 }
126 }
127 return iter;
128 }
129
130 /// remove value from ordered list
131 bool remove(const Value& value) {
132 for (iterator i = super::begin(); i != super::end(); i++)
133 if (*i == value) {
134 super::erase(i);
135 return true;
136 }
137 return false;
138 }
139
140 /// check whether this list contains a specific value
141 bool contains(const Value& value) const {
142 for (const_iterator i = super::begin(); i != super::end(); i++)
143 if (*i == value) return true;
144 return false;
145 }
146
147 Comparator& get_compare() {
148 return compare;
149 }
150};
151
152/// prints a list of items
153template<class V, class C, class L>
154std::ostream& operator<<(std::ostream& s, const minimizer_table<V, C, L>& v) {
155 typedef minimizer_table<V, C, L> t;
156 for (typename t::const_iterator i = v.begin(); i != v.end(); i++) {
157 if (i != v.begin()) s << ",";
158 s << *i;
159 }
160 return s;
161}
162
163#endif /* MINIMIZER_TABLE_HPP_ */
Note: See TracBrowser for help on using the repository browser.