11#pragma once
22
3- #include " cura-formulae-engine/eval.h"
4-
5- #include < zeus/expected.hpp>
6-
73#include < functional>
84#include < string>
5+ #include < unordered_map>
96#include < unordered_set>
7+ #include < zeus/expected.hpp>
8+
9+ #include " cura-formulae-engine/eval.h"
1010
1111namespace CuraFormulaeEngine ::eval
1212{
@@ -36,10 +36,13 @@ class EnvironmentMap : public Environment
3636{
3737private:
3838 std::unordered_map<std::string, eval::Value> environment_ = {};
39- public:
4039
40+ public:
4141 EnvironmentMap () = default ;
42- explicit EnvironmentMap (const std::unordered_map<std::string, eval::Value>& map) : environment_(map) {}
42+ explicit EnvironmentMap (const std::unordered_map<std::string, eval::Value>& map)
43+ : environment_(map)
44+ {
45+ }
4346 ~EnvironmentMap () override = default ;
4447
4548 [[nodiscard]] std::optional<eval::Value> get (const std::string& key) const noexcept override ;
@@ -52,31 +55,58 @@ class EnvironmentMap : public Environment
5255
5356 void set (const std::string& key, const eval::Value& value) noexcept ;
5457
55- [[nodiscard]] EnvironmentMap clone () const noexcept ;
58+ void add ( const std::unordered_map<std::string, eval::Value>& values) ;
5659
60+ [[nodiscard]] EnvironmentMap clone () const noexcept ;
5761};
5862
59- class LocalEnvironment : public Environment
63+ class ChainableEnvironment : public Environment
6064{
65+ private:
66+ const Environment* shadow_environment_{ nullptr };
67+
6168public:
69+ explicit ChainableEnvironment (const Environment* shadow_environment = nullptr )
70+ : shadow_environment_(shadow_environment)
71+ {
72+ }
73+ ~ChainableEnvironment () override = default ;
6274
63- LocalEnvironment () = default ;
64- explicit LocalEnvironment (const Environment* shadow_environment_)
65- : shadow_environment_(shadow_environment_)
75+ [[nodiscard]] std::optional<eval::Value> get (const std::string& key) const noexcept override final ;
76+
77+ [[nodiscard]] bool has (const std::string& key) const noexcept override final ;
78+
79+ [[nodiscard]] std::unordered_map<std::string, eval::Value> getAll () const noexcept override final ;
80+
81+ protected:
82+ [[nodiscard]] virtual std::optional<eval::Value> getImpl (const std::string& key) const noexcept = 0;
83+
84+ [[nodiscard]] virtual bool hasImpl (const std::string& key) const noexcept = 0;
85+
86+ [[nodiscard]] virtual std::unordered_map<std::string, eval::Value> getAllImpl () const noexcept = 0;
87+ };
88+
89+ class LocalEnvironment : public ChainableEnvironment
90+ {
91+ private:
92+ EnvironmentMap local_environment_;
93+
94+ public:
95+ explicit LocalEnvironment (const Environment* shadow_environment = nullptr )
96+ : ChainableEnvironment(shadow_environment)
6697 {
6798 }
6899 ~LocalEnvironment () override = default ;
69100
70- EnvironmentMap local_environment_ = {};
71- const Environment* shadow_environment_;
72-
73- [[nodiscard]] std::optional<eval::Value> get (const std::string& key) const noexcept override ;
101+ [[nodiscard]] std::optional<eval::Value> getImpl (const std::string& key) const noexcept override ;
74102
75- [[nodiscard]] bool has (const std::string& key) const noexcept override ;
103+ [[nodiscard]] bool hasImpl (const std::string& key) const noexcept override ;
76104
77- [[nodiscard]] std::unordered_map<std::string, eval::Value> getAll () const noexcept override ;
105+ [[nodiscard]] std::unordered_map<std::string, eval::Value> getAllImpl () const noexcept override ;
78106
79107 void set (const std::string& key, const eval::Value& value);
108+
109+ void add (const std::unordered_map<std::string, eval::Value>& values);
80110};
81111
82112} // namespace CuraFormulaeEngine::env
@@ -123,7 +153,8 @@ struct Expr
123153 [[nodiscard]] virtual bool deepEq (const Expr& other) const = 0;
124154
125155 /* *
126- * @brief Traverses the expression tree and applies the visitor function to each node.
156+ * @brief Traverses the expression tree and applies the visitor function to
157+ * each node.
127158 *
128159 * @param visitor The visitor function to apply to each node.
129160 */
0 commit comments