1 //-----------------------------------------------------------------------------
2 /** @file libboardgame_base/TreeReader.h
3     @author Markus Enzenberger
4     @copyright GNU General Public License version 3 or later */
5 //-----------------------------------------------------------------------------
6 
7 #ifndef LIBBOARDGAME_BASE_TREE_READER_H
8 #define LIBBOARDGAME_BASE_TREE_READER_H
9 
10 #include <memory>
11 #include <stack>
12 #include "Reader.h"
13 #include "SgfNode.h"
14 
15 namespace libboardgame_base {
16 
17 //-----------------------------------------------------------------------------
18 
19 class TreeReader
20     : public Reader
21 {
22 public:
23     TreeReader();
24 
25     ~TreeReader() override;
26 
27     void on_begin_tree(bool is_root) override;
28 
29     void on_end_tree(bool is_root) override;
30 
31     void on_begin_node(bool is_root) override;
32 
33     void on_end_node() override;
34 
35     void on_property(const string& identifier,
36                      const vector<string>& values) override;
37 
get_tree()38     const SgfNode& get_tree() const { return *m_root; }
39 
40     /** Get the tree and transfer the ownership to the caller. */
41     unique_ptr<SgfNode> get_tree_transfer_ownership();
42 
43 private:
44     SgfNode* m_current = nullptr;
45 
46     unique_ptr<SgfNode> m_root;
47 
48     stack<SgfNode*> m_stack;
49 };
50 
51 //-----------------------------------------------------------------------------
52 
53 } // namespace libboardgame_base
54 
55 #endif // LIBBOARDGAME_BASE_TREE_READER_H
56