mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 09:14:42 +01:00
Create a Dictionary abstraction over the raw Cons list. (#327)
* Create a Dictionary abstraction over the raw Cons list. * renamed Cons and some methods of Dictionary, various other cleanup
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
|
||||
#ifndef EXECUTABLE_SEMANTICS_INTERPRETER_DICTIONARY_H_
|
||||
#define EXECUTABLE_SEMANTICS_INTERPRETER_DICTIONARY_H_
|
||||
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
|
||||
#include "executable_semantics/interpreter/list_node.h"
|
||||
|
||||
namespace Carbon {
|
||||
|
||||
// A persistent dictionary with a simple implementation.
|
||||
// Copying the dictionary is O(1) time.
|
||||
template <class K, class V>
|
||||
class Dictionary {
|
||||
public:
|
||||
// Create an empty dictionary.
|
||||
Dictionary() { head = nullptr; }
|
||||
|
||||
// Return the value associated with the given key.
|
||||
// Time complexity: O(n) where n is the number of times
|
||||
// any value has been set across all keys.
|
||||
auto Get(const K& key) -> std::optional<V> {
|
||||
for (auto kv : *this) {
|
||||
if (kv.first == key) {
|
||||
return kv.second;
|
||||
}
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
// Associate the value v with key k in the dictionary.
|
||||
// Time complexity: O(1).
|
||||
auto Set(const K& k, const V& v) -> void {
|
||||
head = new ListNode<std::pair<K, V>>(std::make_pair(k, v), head);
|
||||
}
|
||||
|
||||
typedef ListNodeIterator<std::pair<K, V>> Iterator;
|
||||
|
||||
// The position of the first element of the dictionary
|
||||
// or `end()` if the dictionary is empty.
|
||||
auto begin() const -> Iterator { return Iterator(head); }
|
||||
|
||||
// The position one past that of the last element.
|
||||
auto end() const -> Iterator { return Iterator(nullptr); }
|
||||
|
||||
private:
|
||||
Dictionary(ListNode<std::pair<K, V>>* h) : head(h) {}
|
||||
|
||||
ListNode<std::pair<K, V>>* head;
|
||||
};
|
||||
|
||||
} // namespace Carbon
|
||||
|
||||
#endif // EXECUTABLE_SEMANTICS_INTERPRETER_DICTIONARY_H_
|
||||
Reference in New Issue
Block a user