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
11namespace fuzzing {
12
13StringMap::StringMap() {
14    iterator_ = elements_.end();
15}
16
17StringMap::~StringMap() {}
18
19bool StringMap::is_empty() const {
20    return elements_.is_empty();
21}
22
23size_t StringMap::size() const {
24    return elements_.size();
25}
26
27void StringMap::begin() {
28    iterator_ = elements_.begin();
29}
30
31bool StringMap::next(const char** out_key, const char** out_val) {
32    if (iterator_ == elements_.end()) {
33        return false;
34    }
35    if (out_key) {
36        *out_key = iterator_->key.c_str();
37    }
38    if (out_val) {
39        *out_val = iterator_->val.c_str();
40    }
41    iterator_++;
42    return true;
43}
44
45const char* StringMap::get(const char* key) const {
46    ZX_DEBUG_ASSERT(key);
47    auto iterator = elements_.find(key);
48    return iterator == elements_.end() ? nullptr : iterator->val.c_str();
49}
50
51void StringMap::set(const char* key, const char* val) {
52    ZX_DEBUG_ASSERT(key);
53    ZX_DEBUG_ASSERT(val);
54    fbl::AllocChecker ac;
55    fbl::unique_ptr<StringElement> element(new (&ac) StringElement());
56    ZX_ASSERT(ac.check());
57    element->key.Set(key, &ac);
58    ZX_ASSERT(ac.check());
59    element->val.Set(val, &ac);
60    ZX_ASSERT(ac.check());
61    elements_.insert_or_replace(fbl::move(element));
62    iterator_ = elements_.end();
63}
64
65void StringMap::erase(const char* key) {
66    ZX_DEBUG_ASSERT(key);
67    elements_.erase(key);
68    iterator_ = elements_.end();
69}
70
71void StringMap::clear() {
72    elements_.clear();
73    iterator_ = elements_.end();
74}
75
76} // namespace fuzzing
77