aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/trie.h28
-rw-r--r--src/utility.h32
2 files changed, 37 insertions, 23 deletions
diff --git a/src/trie.h b/src/trie.h
index 629e724..6262ab3 100644
--- a/src/trie.h
+++ b/src/trie.h
@@ -39,22 +39,28 @@ class Trie {
return this->resolve(path);
}
- inline detail::Result<Value*> get(key_list path) {
+ inline detail::optional_ptr<Value> get(key_list path) {
if ( auto tmp = this->resolve(path) ) {
if ( tmp.get()->value_.first ) {
- return detail::Result<Value*>(&tmp.get()->value_.second);
+ return detail::optional_ptr<Value>(
+ &tmp.get()->value_.second
+ );
} else {
- return detail::Result<Value*>();
+ return detail::optional_ptr<Value>();
}
} else {
- return detail::Result<Value*>();
+ return detail::optional_ptr<Value>();
}
}
+ inline void set(Value value) {
+ this->value_.first = true;
+ this->value_.second = value;
+ }
+
inline bool set(key_list path, Value value) {
if ( auto tmp = this->resolve(path) ) {
- tmp.get()->value_.first = true;
- tmp.get()->value_.second = value;
+ tmp.get()->set(value);
return true;
} else {
@@ -105,11 +111,11 @@ class Trie {
}
}
- inline detail::Result<Trie*> resolve(key_list path) {
+ inline detail::optional_ptr<Trie> resolve(key_list path) {
return this->resolve(path, path.begin());
}
- inline detail::Result<Trie*> resolve(
+ inline detail::optional_ptr<Trie> resolve(
key_list& path,
typename key_list::const_iterator currStep
) {
@@ -123,12 +129,14 @@ class Trie {
);
if ( nextStep == path.end() ) {
- return detail::Result<Trie*>(&(*matchingTrie).second);
+ return detail::optional_ptr<Trie>(
+ &(*matchingTrie).second
+ );
} else {
return (*matchingTrie).second.resolve(path, nextStep);
}
} else {
- return detail::Result<Trie*>();
+ return detail::optional_ptr<Trie>();
}
}
diff --git a/src/utility.h b/src/utility.h
index 6342420..db33608 100644
--- a/src/utility.h
+++ b/src/utility.h
@@ -4,24 +4,30 @@
namespace detail {
template <
- typename Value
+ typename Type
>
-struct Result {
- Result():
- value_(false, Value()) { }
+class optional_ptr {
+ public:
+ typedef typename std::add_pointer<Type>::type pointer;
+ typedef Type element_type;
- Result(Value value):
- value_(true, value) { }
+ optional_ptr():
+ value_(false, nullptr) { }
- inline operator bool() const {
- return this->value_.first;
- }
+ optional_ptr(pointer ptr):
+ value_(true, ptr) { }
- inline Value get() const {
- return this->value_.second;
- }
+ inline operator bool() const {
+ return this->value_.first;
+ }
+
+ inline pointer get() const {
+ return this->value_.second;
+ }
+
+ private:
+ const std::pair<bool, pointer> value_;
- const std::pair<bool, Value> value_;
};
}