| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- // 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_FIELD_PATH_H_
- #define EXECUTABLE_SEMANTICS_INTERPRETER_FIELD_PATH_H_
- #include <string>
- #include <vector>
- #include "common/ostream.h"
- namespace Carbon {
- // Given some initial Value, a FieldPath identifies a sub-Value within it,
- // in much the same way that a file path identifies a file within some
- // directory. FieldPaths are relative rather than absolute: the initial
- // Value is specified by the context in which the FieldPath is used, not
- // by the FieldPath itself.
- //
- // A FieldPath consists of a series of steps, which specify how to
- // incrementally navigate from a Value to one of its fields. Currently
- // there is only one kind of step, a string specifying a child field by name,
- // but that may change as Carbon develops. Note that an empty FieldPath
- // refers to the initial Value itself.
- class FieldPath {
- public:
- // Constructs an empty FieldPath.
- FieldPath() = default;
- // Constructs a FieldPath consisting of a single step.
- explicit FieldPath(std::string name) : components({std::move(name)}) {}
- FieldPath(const FieldPath&) = default;
- FieldPath(FieldPath&&) = default;
- auto operator=(const FieldPath&) -> FieldPath& = default;
- auto operator=(FieldPath&&) -> FieldPath& = default;
- // Returns whether *this is empty.
- auto IsEmpty() const -> bool { return components.empty(); }
- // Appends `name` to the end of *this.
- auto Append(std::string name) -> void {
- components.push_back(std::move(name));
- }
- void Print(llvm::raw_ostream& out) const {
- for (const std::string& component : components) {
- out << "." << component;
- }
- }
- private:
- // The representation of FieldPath describes how to locate a Value within
- // another Value, so its implementation details are tied to the implementation
- // details of Value.
- friend struct Value;
- std::vector<std::string> components;
- };
- } // namespace Carbon
- #endif // EXECUTABLE_SEMANTICS_INTERPRETER_FIELD_PATH_H_
|