Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added a const_iterator back in #1418

Merged
merged 1 commit into from
Jan 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion gtsam/nonlinear/Values.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,11 @@ namespace gtsam {

typedef KeyValuePair value_type;

/// @name Constructors
/// @{

/** Default constructor creates an empty Values class */
Values() {}
Values() = default;

/** Copy constructor duplicates all keys and values */
Values(const Values& other);
Expand All @@ -124,6 +127,7 @@ namespace gtsam {
/** Construct from a Values and an update vector: identical to other.retract(delta) */
Values(const Values& other, const VectorValues& delta);

/// @}
/// @name Testable
/// @{

Expand All @@ -134,6 +138,8 @@ namespace gtsam {
bool equals(const Values& other, double tol=1e-9) const;

/// @}
/// @name Standard Interface
/// @{

/** Retrieve a variable by key \c j. The type of the value associated with
* this key is supplied as a template argument to this function.
Expand Down Expand Up @@ -174,6 +180,42 @@ namespace gtsam {
/** whether the config is empty */
bool empty() const { return values_.empty(); }

/// @}
/// @name Iterator
/// @{

struct deref_iterator {
using const_iterator_type = typename KeyValueMap::const_iterator;
const_iterator_type it_;
deref_iterator(const_iterator_type it) : it_(it) {}
ConstKeyValuePair operator*() const { return {it_->first, *(it_->second)}; }
std::unique_ptr<ConstKeyValuePair> operator->() {
return std::make_unique<ConstKeyValuePair>(it_->first, *(it_->second));
}
bool operator==(const deref_iterator& other) const {
return it_ == other.it_;
}
bool operator!=(const deref_iterator& other) const { return it_ != other.it_; }
deref_iterator& operator++() {
++it_;
return *this;
}
};

deref_iterator begin() const { return deref_iterator(values_.begin()); }
deref_iterator end() const { return deref_iterator(values_.end()); }

/** Find an element by key, returning an iterator, or end() if the key was
* not found. */
deref_iterator find(Key j) const { return deref_iterator(values_.find(j)); }

/** Find the element greater than or equal to the specified key. */
deref_iterator lower_bound(Key j) const { return deref_iterator(values_.lower_bound(j)); }

/** Find the lowest-ordered element greater than the specified key. */
deref_iterator upper_bound(Key j) const { return deref_iterator(values_.upper_bound(j)); }

/// @}
/// @name Manifold Operations
/// @{

Expand Down
20 changes: 20 additions & 0 deletions gtsam/nonlinear/tests/testValues.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,31 @@ TEST(Values, basic_functions)
values.insert(6, M1);
values.insert(8, M2);


EXPECT(!values.exists(1));
EXPECT(values.exists(2));
EXPECT(values.exists(4));
EXPECT(values.exists(6));
EXPECT(values.exists(8));

size_t count = 0;
for (const auto& [key, value] : values) {
count += 1;
if (key == 2 || key == 4) EXPECT_LONGS_EQUAL(3, value.dim());
if (key == 6 || key == 8) EXPECT_LONGS_EQUAL(6, value.dim());
}
EXPECT_LONGS_EQUAL(4, count);

// find
EXPECT_LONGS_EQUAL(4, values.find(4)->key);

// lower_bound
EXPECT_LONGS_EQUAL(4, values.lower_bound(4)->key);
EXPECT_LONGS_EQUAL(4, values.lower_bound(3)->key);

// upper_bound
EXPECT_LONGS_EQUAL(6, values.upper_bound(4)->key);
EXPECT_LONGS_EQUAL(4, values.upper_bound(3)->key);
}

/* ************************************************************************* */
Expand Down