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