1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <fbl/alloc_checker.h>
6 #include <fbl/intrusive_wavl_tree.h>
7 #include <fbl/string.h>
8 #include <fbl/unique_ptr.h>
9 #include <fuzz-utils/string-map.h>
10 
11 #include <utility>
12 
13 namespace fuzzing {
14 
StringMap()15 StringMap::StringMap() {
16     iterator_ = elements_.end();
17 }
18 
~StringMap()19 StringMap::~StringMap() {}
20 
is_empty() const21 bool StringMap::is_empty() const {
22     return elements_.is_empty();
23 }
24 
size() const25 size_t StringMap::size() const {
26     return elements_.size();
27 }
28 
begin()29 void StringMap::begin() {
30     iterator_ = elements_.begin();
31 }
32 
next(const char ** out_key,const char ** out_val)33 bool StringMap::next(const char** out_key, const char** out_val) {
34     if (iterator_ == elements_.end()) {
35         return false;
36     }
37     if (out_key) {
38         *out_key = iterator_->key.c_str();
39     }
40     if (out_val) {
41         *out_val = iterator_->val.c_str();
42     }
43     iterator_++;
44     return true;
45 }
46 
next(fbl::String * out_key,fbl::String * out_val)47 bool StringMap::next(fbl::String* out_key, fbl::String* out_val) {
48     const char *key, *val;
49     bool result = next(&key, &val);
50     if (out_key) {
51         out_key->Set(key);
52     }
53     if (out_val) {
54         out_val->Set(val);
55     }
56     return result;
57 }
58 
get(const char * key) const59 const char* StringMap::get(const char* key) const {
60     ZX_DEBUG_ASSERT(key);
61     auto iterator = elements_.find(key);
62     return iterator == elements_.end() ? nullptr : iterator->val.c_str();
63 }
64 
set(const char * key,const char * val)65 void StringMap::set(const char* key, const char* val) {
66     ZX_DEBUG_ASSERT(key);
67     ZX_DEBUG_ASSERT(val);
68     fbl::AllocChecker ac;
69     fbl::unique_ptr<StringElement> element(new (&ac) StringElement());
70     ZX_ASSERT(ac.check());
71     element->key.Set(key, &ac);
72     ZX_ASSERT(ac.check());
73     element->val.Set(val, &ac);
74     ZX_ASSERT(ac.check());
75     elements_.insert_or_replace(std::move(element));
76     iterator_ = elements_.end();
77 }
78 
erase(const char * key)79 void StringMap::erase(const char* key) {
80     ZX_DEBUG_ASSERT(key);
81     elements_.erase(key);
82     iterator_ = elements_.end();
83 }
84 
clear()85 void StringMap::clear() {
86     elements_.clear();
87     iterator_ = elements_.end();
88 }
89 
90 } // namespace fuzzing
91