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