Create an abstract class for schemas

Change-Id: I0845e8fa11db68add75bed40d44779f67c0a33aa
diff --git a/src/static_schema.hpp b/src/static_schema.hpp
new file mode 100644
index 0000000..bab8bde
--- /dev/null
+++ b/src/static_schema.hpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
+ * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
+ *
+ * Written by Václav Kubernát <kubervac@fit.cvut.cz>
+ *
+*/
+
+#pragma once
+
+#include <boost/variant.hpp>
+#include <set>
+#include <stdexcept>
+#include <unordered_map>
+#include "ast_path.hpp"
+#include "schema.hpp"
+
+
+/*! \class StaticSchema
+ *     \brief Static schema, used mainly for testing
+ *         */
+
+class StaticSchema : public Schema {
+public:
+    StaticSchema();
+
+    bool isContainer(const path_& location, const std::string& name) const override;
+    bool isLeaf(const path_& location, const std::string& name) const override;
+    bool isList(const path_& location, const std::string& name) const override;
+    bool isPresenceContainer(const path_& location, const std::string& name) const override;
+    bool leafEnumHasValue(const path_& location, const std::string& name, const std::string& value) const override;
+    bool listHasKey(const path_& location, const std::string& name, const std::string& key) const override;
+    bool nodeExists(const std::string& location, const std::string& name) const override;
+    const std::set<std::string>& listKeys(const path_& location, const std::string& name) const override;
+    yang::LeafDataTypes leafType(const path_& location, const std::string& name) const override;
+
+    void addContainer(const std::string& location, const std::string& name, yang::ContainerTraits isPresence = yang::ContainerTraits::None);
+    void addLeaf(const std::string& location, const std::string& name, const yang::LeafDataTypes& type);
+    void addLeafEnum(const std::string& location, const std::string& name, std::set<std::string> enumValues);
+    void addList(const std::string& location, const std::string& name, const std::set<std::string>& keys);
+
+private:
+    const std::unordered_map<std::string, NodeType>& children(const std::string& name) const;
+
+    std::unordered_map<std::string, std::unordered_map<std::string, NodeType>> m_nodes;
+};