From ba9a9199d01b0fdd4bf9a54914f8058bf71f30c5 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Thu, 17 Apr 2025 16:03:01 +0000
Subject: [PATCH] unary and binary operations
---
src/Interpreter/OperationContainer.hpp | 129 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 126 insertions(+), 3 deletions(-)
diff --git a/src/Interpreter/OperationContainer.hpp b/src/Interpreter/OperationContainer.hpp
index 62b5c1d..20f9e2c 100644
--- a/src/Interpreter/OperationContainer.hpp
+++ b/src/Interpreter/OperationContainer.hpp
@@ -1,12 +1,135 @@
#ifndef INTERPRETER_OPERATION_CONTAINER_HPP
#define INTERPRETER_OPERATION_CONTAINER_HPP
+#include <map>
+#include <string>
#include <vector>
#include "Interpreter/Operation.hpp"
-namespace Interpreter {
-using OperationContainer = std::vector<Operation>;
-}; // namespace Interpreter
+namespace Operations {
+
+class Container {
+
+ public:
+ /**
+ * @brief Get the Operations::Container instance.
+ * @return The Operations::Container instance.
+ */
+ static Operations::Container * instance() {
+ static Operations::Container instance_;
+ return &instance_;
+ }
+
+ Container() = default;
+
+ void add(const std::string & ns, Operations::Operation operation) {
+ this->_operations[ns].emplace_back(std::make_shared<Operations::Operation>(std::move(operation)));
+ }
+
+ /**
+ * @brief Returns the first operation in the namespace.
+ * @param ns Namespace from which to get the operation.
+ * @return The first operation in the namespace.
+ */
+ std::shared_ptr<Operations::Operation> getFirst(const std::string & ns) {
+ auto it = _operations.find(ns);
+ if (it != _operations.end()) {
+ return it->second.front();
+ }
+ return nullptr;
+ }
+
+ /**
+ * @brief Removes the first operation from the namespace.
+ * @param ns Namespace from which to remove the operation.
+ * @return The removed operation.
+ */
+ std::shared_ptr<Operations::Operation> pullFirst(const std::string & ns) {
+ auto it = _operations.find(ns);
+ if (it != _operations.end()) {
+ auto operation = it->second.front();
+ it->second.erase(it->second.begin());
+ return operation;
+ }
+ return nullptr;
+ }
+
+ /**
+ * @brief Removes the last operation from the namespace.
+ * @param ns Namespace from which to remove the operation.
+ * @return The removed operation.
+ */
+ std::shared_ptr<Operations::Operation> pullLast(const std::string & ns) {
+ auto it = _operations.find(ns);
+ if (it != _operations.end()) {
+ auto operation = it->second.back();
+ it->second.pop_back();
+ return operation;
+ }
+ return nullptr;
+ }
+
+ /**
+ * @brief Returns the last operation in the namespace.
+ * @param ns Namespace from which to get the operation.
+ * @return The last operation in the namespace.
+ */
+ std::shared_ptr<Operations::Operation> getLast(const std::string & ns) {
+ auto it = _operations.find(ns);
+ if (it != _operations.end()) {
+ return it->second.back();
+ }
+ return nullptr;
+ }
+
+ /**
+ * @brief Returns all operations in the namespace.
+ * @param ns Namespace from which to get the operations.
+ * @return All operations in the namespace.
+ */
+ std::vector<std::shared_ptr<Operations::Operation>> getAll(const std::string & ns) {
+ auto it = _operations.find(ns);
+ if (it != _operations.end()) {
+ return it->second;
+ }
+ return {};
+ }
+
+ /**
+ * @brief Returns all operations from all namespaces
+ * @return All operations in the namespace.
+ */
+ std::vector<std::shared_ptr<Operations::Operation>> getAll() {
+ std::vector<std::shared_ptr<Operations::Operation>> result;
+ for (const auto & [_, table] : _operations) {
+ result.insert(result.end(), table.begin(), table.end());
+ }
+ return result;
+ }
+
+ auto begin() { return _operations.begin(); }
+
+ auto end() { return _operations.end(); }
+
+ auto begin() const { return _operations.begin(); }
+
+ auto end() const { return _operations.end(); }
+
+ static std::string dump() {
+ std::string result = "";
+ for (const auto & [_, table] : Operations::Container::instance()->_operations) {
+ result += "Namespace: " + _ + "\n";
+ for (const auto & operation : table) {
+ result += " Operation: " + operation->toString() + "\n";
+ }
+ }
+ return result;
+ }
+
+ private:
+ std::map<std::string, std::vector<std::shared_ptr<Operations::Operation>>> _operations;
+}; // class Container
+}; // namespace Operations
#endif // INTERPRETER_OPERATION_CONTAINER_HPP
--
Gitblit v1.9.3