Added find function and more efficient version of pop_back to Ordering
parent
059de23b6e
commit
ca62706f55
|
|
@ -70,6 +70,22 @@ Ordering::value_type Ordering::pop_back() {
|
||||||
return value_type();
|
return value_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
Index Ordering::pop_back(const Symbol& key) {
|
||||||
|
Map::iterator item = order_.find(key);
|
||||||
|
if(item == order_.end()) {
|
||||||
|
throw invalid_argument("Attempting to remove a key from an ordering that does not contain that key");
|
||||||
|
} else {
|
||||||
|
if(item->second != nVars_ - 1) {
|
||||||
|
throw invalid_argument("Attempting to remove a key from an ordering in which that key is not last");
|
||||||
|
} else {
|
||||||
|
order_.erase(item);
|
||||||
|
-- nVars_;
|
||||||
|
return nVars_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
void Unordered::print(const string& s) const {
|
void Unordered::print(const string& s) const {
|
||||||
cout << s << " (" << size() << "):";
|
cout << s << " (" << size() << "):";
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,22 @@ public:
|
||||||
Index operator[](const Symbol& key) const {
|
Index operator[](const Symbol& key) const {
|
||||||
const_iterator i=order_.find(key); assert(i != order_.end()); return i->second; }
|
const_iterator i=order_.find(key); assert(i != order_.end()); return i->second; }
|
||||||
|
|
||||||
|
/** Returns an iterator pointing to the symbol/index pair with the requested,
|
||||||
|
* or the end iterator if it does not exist.
|
||||||
|
*
|
||||||
|
* @return An iterator pointing to the symbol/index pair with the requested,
|
||||||
|
* or the end iterator if it does not exist.
|
||||||
|
*/
|
||||||
|
iterator find(const Symbol& key) { return order_.find(key); }
|
||||||
|
|
||||||
|
/** Returns an iterator pointing to the symbol/index pair with the requested,
|
||||||
|
* or the end iterator if it does not exist.
|
||||||
|
*
|
||||||
|
* @return An iterator pointing to the symbol/index pair with the requested,
|
||||||
|
* or the end iterator if it does not exist.
|
||||||
|
*/
|
||||||
|
const_iterator find(const Symbol& key) const { return order_.find(key); }
|
||||||
|
|
||||||
// adding symbols
|
// adding symbols
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -105,9 +121,21 @@ public:
|
||||||
|
|
||||||
Index push_back(const Symbol& key) { return insert(std::make_pair(key, nVars_))->second; }
|
Index push_back(const Symbol& key) { return insert(std::make_pair(key, nVars_))->second; }
|
||||||
|
|
||||||
/** remove the last symbol/index pair from the ordering */
|
/** Remove the last symbol/index pair from the ordering - this is inefficient.
|
||||||
|
* If you already know the last-ordered symbol, call the version of pop_back
|
||||||
|
* that accepts this symbol as an argument.
|
||||||
|
*
|
||||||
|
* @return The symbol and index that were removed.
|
||||||
|
*/
|
||||||
value_type pop_back();
|
value_type pop_back();
|
||||||
|
|
||||||
|
/** Remove the last-ordered symbol from the ordering. This is efficient, as
|
||||||
|
* opposed to the no-argument version of pop_back.
|
||||||
|
*
|
||||||
|
* @return The index of the symbol that was removed.
|
||||||
|
*/
|
||||||
|
Index pop_back(const Symbol& key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* += operator allows statements like 'ordering += x0,x1,x2,x3;', which are
|
* += operator allows statements like 'ordering += x0,x1,x2,x3;', which are
|
||||||
* very useful for unit tests. This functionality is courtesy of
|
* very useful for unit tests. This functionality is courtesy of
|
||||||
|
|
|
||||||
|
|
@ -32,13 +32,17 @@ TEST( testOrdering, simple_modifications ) {
|
||||||
EXPECT_LONGS_EQUAL(3, ordering.size());
|
EXPECT_LONGS_EQUAL(3, ordering.size());
|
||||||
EXPECT(assert_equal(x4, x4p.first));
|
EXPECT(assert_equal(x4, x4p.first));
|
||||||
|
|
||||||
Ordering::value_type x3p = ordering.pop_back();
|
Index x3p = ordering.pop_back(x3);
|
||||||
EXPECT_LONGS_EQUAL(2, ordering.size());
|
EXPECT_LONGS_EQUAL(2, ordering.size());
|
||||||
EXPECT(assert_equal(x3, x3p.first));
|
EXPECT_LONGS_EQUAL(2, (int)x3p);
|
||||||
|
|
||||||
|
// try to pop an element that doesn't exist and isn't last
|
||||||
|
CHECK_EXCEPTION(ordering.pop_back(x4), std::invalid_argument);
|
||||||
|
CHECK_EXCEPTION(ordering.pop_back(x1), std::invalid_argument);
|
||||||
|
|
||||||
// reassemble back make the ordering 1, 2, 4, 3
|
// reassemble back make the ordering 1, 2, 4, 3
|
||||||
ordering.push_back(x4p.first);
|
ordering.push_back(x4);
|
||||||
ordering.push_back(x3p.first);
|
ordering.push_back(x3);
|
||||||
|
|
||||||
// verify
|
// verify
|
||||||
Ordering expectedFinal;
|
Ordering expectedFinal;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue