From 13f079c5150d86bb87b71094e545e720e245658d Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Thu, 6 Feb 2014 20:26:45 +0100 Subject: Introduced simple result wrapper template * offers bool() operator for easy assignment checks inside conditional statements --- src/trie.h | 34 ++++++++++++++++------------------ src/utility.h | 29 +++++++++++++++++++++++++++++ test.cc | 30 +++++++++++++++--------------- 3 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 src/utility.h diff --git a/src/trie.h b/src/trie.h index d4763ef..629e724 100644 --- a/src/trie.h +++ b/src/trie.h @@ -4,6 +4,8 @@ #include #include +#include "utility.h" + template < typename Key, typename Value = std::nullptr_t @@ -34,29 +36,25 @@ class Trie { } inline bool check(key_list path) { - return this->resolve(path).first; + return this->resolve(path); } - inline std::pair get(key_list path) { - std::pair tmp(this->resolve(path)); - - if ( tmp.first ) { - if ( tmp.second->value_.first ) { - return std::make_pair(true, &tmp.second->value_.second); + inline detail::Result get(key_list path) { + if ( auto tmp = this->resolve(path) ) { + if ( tmp.get()->value_.first ) { + return detail::Result(&tmp.get()->value_.second); } else { - return std::make_pair(false, nullptr); + return detail::Result(); } } else { - return std::make_pair(false, nullptr); + return detail::Result(); } } inline bool set(key_list path, Value value) { - std::pair tmp(this->resolve(path)); - - if ( tmp.first ) { - tmp.second->value_.first = true; - tmp.second->value_.second = value; + if ( auto tmp = this->resolve(path) ) { + tmp.get()->value_.first = true; + tmp.get()->value_.second = value; return true; } else { @@ -107,11 +105,11 @@ class Trie { } } - inline std::pair resolve(key_list path) { + inline detail::Result resolve(key_list path) { return this->resolve(path, path.begin()); } - inline std::pair resolve( + inline detail::Result resolve( key_list& path, typename key_list::const_iterator currStep ) { @@ -125,12 +123,12 @@ class Trie { ); if ( nextStep == path.end() ) { - return std::make_pair(true, &(*matchingTrie).second); + return detail::Result(&(*matchingTrie).second); } else { return (*matchingTrie).second.resolve(path, nextStep); } } else { - return std::make_pair(false, nullptr); + return detail::Result(); } } diff --git a/src/utility.h b/src/utility.h new file mode 100644 index 0000000..6342420 --- /dev/null +++ b/src/utility.h @@ -0,0 +1,29 @@ +#ifndef TRIE_SRC_UTILITY_H_ +#define TRIE_SRC_UTILITY_H_ + +namespace detail { + +template < + typename Value +> +struct Result { + Result(): + value_(false, Value()) { } + + Result(Value value): + value_(true, value) { } + + inline operator bool() const { + return this->value_.first; + } + + inline Value get() const { + return this->value_.second; + } + + const std::pair value_; +}; + +} + +#endif // TRIE_SRC_UTILITY_H_ diff --git a/test.cc b/test.cc index 2a99619..46ed5cd 100644 --- a/test.cc +++ b/test.cc @@ -50,25 +50,25 @@ TEST_F(TrieTest, Value) { trie.add({2, 3, 4, 5}, 44); trie.add({2, 3, 1, 2}, 45); - EXPECT_EQ(trie.get({1, 1, 1, 1}).first, true); - EXPECT_EQ(*trie.get({1, 1, 1, 1}).second, 42); - EXPECT_EQ(trie.get({1, 2, 1, 2}).first, true); - EXPECT_EQ(*trie.get({1, 2, 1, 2}).second, 43); - EXPECT_EQ(trie.get({2, 3, 4, 5}).first, true); - EXPECT_EQ(*trie.get({2, 3, 4, 5}).second, 44); - EXPECT_EQ(trie.get({2, 3, 4, 5}).first, true); - EXPECT_EQ(*trie.get({2, 3, 1, 2}).second, 45); - - EXPECT_EQ(trie.get({1, 2}).first, false); - EXPECT_EQ(trie.get({1, 2}).second, nullptr); + EXPECT_EQ(trie.get({1, 1, 1, 1}), true); + EXPECT_EQ(*trie.get({1, 1, 1, 1}).get(), 42); + EXPECT_EQ(trie.get({1, 2, 1, 2}), true); + EXPECT_EQ(*trie.get({1, 2, 1, 2}).get(), 43); + EXPECT_EQ(trie.get({2, 3, 4, 5}), true); + EXPECT_EQ(*trie.get({2, 3, 4, 5}).get(), 44); + EXPECT_EQ(trie.get({2, 3, 4, 5}), true); + EXPECT_EQ(*trie.get({2, 3, 1, 2}).get(), 45); + + EXPECT_EQ(trie.get({1, 2}), false); + EXPECT_EQ(trie.get({1, 2}).get(), nullptr); trie.set({1, 2}, 42); trie.set({1, 1, 1, 1}, 255); - EXPECT_EQ(trie.get({1, 2}).first, true); - EXPECT_EQ(*trie.get({1, 2}).second, 42); - EXPECT_EQ(trie.get({1, 1, 1, 1}).first, true); - EXPECT_EQ(*trie.get({1, 1, 1, 1}).second, 255); + EXPECT_EQ(trie.get({1, 2}), true); + EXPECT_EQ(*trie.get({1, 2}).get(), 42); + EXPECT_EQ(trie.get({1, 1, 1, 1}), true); + EXPECT_EQ(*trie.get({1, 1, 1, 1}).get(), 255); } int main(int argc, char **argv) { -- cgit v1.2.3