// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <fbl/intrusive_wavl_tree.h>
#include <fbl/string.h>
#include <fbl/unique_ptr.h>

namespace fuzzing {

// |fuzzing::StringMap| is a small wrapper class used to make C-style strings easy to store and
// manipulate in a |fbl::WAVLTree|.
class StringMap final {
public:
    StringMap();
    ~StringMap();

    // Identical to |fbl::WAVLTree<fbl::unique_ptr<StringElement>>::is_empty|.
    bool is_empty() const;

    // Identical to |fbl::WAVLTree<fbl::unique_ptr<StringElement>>::size|.
    size_t size() const;

    // In place of iterators, this class provides |first| and |next| methods.  The former resets the
    // internal iterator to the beginning of the map, while the latter returns successive key-value
    // pairs via |out_key| and |out_value| with each successive call until it reaches the end of the
    // map and returns null.  The map can be simply iterated by:
    //   const char *key;
    //   const char *value;
    //   map.begin();
    //   while(map.next(&key, &value)) { ... }
    void begin();
    bool next(const char** out_key, const char** out_val);

    // Returns the value for the given |key|, or null if the key isn't found.
    const char* get(const char* key) const;

    // Associates the given |value| with the given |key|.  |key| and |value| must not be null.
    void set(const char* key, const char* val);

    // Removes any value associated with the given |key| and removes it from the map.
    void erase(const char* key);

    // Erases all keys.
    void clear();

private:
    DISALLOW_COPY_ASSIGN_AND_MOVE(StringMap);

    // |fuzzing::StringMap::StringElement| is an internal intrusive container used to back the
    // strings in the list.
    struct StringElement final : public fbl::WAVLTreeContainable<fbl::unique_ptr<StringElement>> {
        fbl::String key;
        fbl::String val;
    };

    // |fuzzing::StringMap::KeyTraits| is used to sort keys lexicographically.
    struct KeyTraits {
        static const char* GetKey(const StringElement& element) { return element.key.c_str(); }
        static bool LessThan(const char* key1, const char* key2) { return strcmp(key1, key2) < 0; }
        static bool EqualTo(const char* key1, const char* key2) { return strcmp(key1, key2) == 0; }
    };

    // The actual map pairs, and an iterator to return the |next| one.
    using Map = fbl::WAVLTree<const char*, fbl::unique_ptr<StringElement>, KeyTraits>;
    Map elements_;
    Map::iterator iterator_;
};

} // namespace fuzzing
