77#include < string>
88#include < type_traits>
99#include < vector>
10+ #include < queue>
1011
12+ #include " treenode.h"
13+ #include " singletreenode.h"
14+ #include " treenode.h"
1115#include " typetraits.h"
1216
1317void removeOuterSpaces (std::string& value) {
@@ -50,7 +54,7 @@ std::string removeQuotes(const std::string& str) {
5054 return removeEncapsulatedTokens (str);
5155}
5256
53- std::vector<std::string> splitIgnoreBrackets (const std::string& str,
57+ std::vector<std::string> splitIgnoreBrackets (const std::string str,
5458 char delimiter) {
5559 std::vector<std::string> result;
5660 std::string token;
@@ -77,7 +81,19 @@ std::vector<std::string> splitIgnoreBrackets(const std::string& str,
7781}
7882
7983template <typename T>
80- std::enable_if_t <std::is_same_v<char , T>, T> parse (std::string& value) {
84+ std::enable_if_t <std::is_same_v<bool , T>, T> parse (std::string value) {
85+ removeOuterSpaces (value);
86+ if (value != " true" && value != " false" ) {
87+ std::stringstream ss;
88+ ss << " Error: Invalid boolean format. Must be either \" true\" or "
89+ " \" false\" . String: " << value;
90+ throw std::runtime_error (ss.str ());
91+ }
92+ return value == " true" ? true : false ;
93+ }
94+
95+ template <typename T>
96+ std::enable_if_t <std::is_same_v<char , T>, T> parse (std::string value) {
8197 removeOuterSpaces (value);
8298 if (value.size () != 3 || !isCharFormatOk (value)) {
8399 std::stringstream ss;
@@ -89,7 +105,7 @@ std::enable_if_t<std::is_same_v<char, T>, T> parse(std::string& value) {
89105}
90106
91107template <typename T>
92- std::enable_if_t <std::is_same_v<std::string, T>, T> parse (std::string& value) {
108+ std::enable_if_t <std::is_same_v<std::string, T>, T> parse (std::string value) {
93109 removeOuterSpaces (value);
94110 if (!isStringFormatOk (value)) {
95111 std::stringstream ss;
@@ -101,17 +117,34 @@ std::enable_if_t<std::is_same_v<std::string, T>, T> parse(std::string& value) {
101117}
102118
103119template <typename T>
104- std::enable_if_t <std::is_integral_v<T>, T> parse ( const std::string& value) {
105- std::string valueCopy = value;
106- removeOuterSpaces (valueCopy );
120+ std::enable_if_t <std::is_integral_v<T> && ! std::is_same_v< bool , T>, T>
121+ parse ( std::string value) {
122+ removeOuterSpaces (value );
107123 T ret{};
108- std::stringstream ss (valueCopy );
124+ std::stringstream ss (value );
109125 ss >> ret;
110126 return ret;
111127}
112128
113129template <typename T>
114- std::enable_if_t <is_vector_type<T>::value, T> parse (auto && value) {
130+ std::enable_if_t <std::is_same_v<SingleTreeNode*, T>, T> parse (
131+ std::string value) {
132+ if (value.empty ()) {
133+ std::stringstream ss;
134+ ss << " Error: Invalid TreeNode value. Value: " << value;
135+ throw std::runtime_error (ss.str ());
136+ }
137+
138+ if (value == " null" ) {
139+ return nullptr ;
140+ }
141+
142+ return new SingleTreeNode (parse<int >(std::move (value)));
143+
144+ }
145+
146+ template <typename T>
147+ std::enable_if_t <is_vector_type<T>::value, T> parse (std::string value) {
115148 using element_type = typename T::value_type;
116149 removeOuterSpaces (value);
117150 T vec;
@@ -123,10 +156,47 @@ std::enable_if_t<is_vector_type<T>::value, T> parse(auto&& value) {
123156
124157 std::vector<std::string> tokens =
125158 splitIgnoreBrackets (removeBrackets (value), ' ,' );
126- for (std::string & token : tokens) {
127- vec.push_back (parse<element_type>(token));
159+ for (auto & & token : tokens) {
160+ vec.push_back (parse<element_type>(std::move ( token) ));
128161 }
129162 return vec;
130163}
131164
165+ TreeNode* convertToTree (const std::vector<SingleTreeNode*>& nodes) {
166+ if (nodes.empty () || nodes[0 ] == nullptr ) {
167+ return nullptr ;
168+ }
169+
170+ SingleTreeNode* root = static_cast <SingleTreeNode*>(nodes[0 ]);
171+ std::queue<TreeNode*> queue;
172+ queue.push (root);
173+
174+ size_t i = 1 ;
175+ while (!queue.empty () && i < nodes.size ()) {
176+ TreeNode* current = queue.front ();
177+ queue.pop ();
178+
179+ if (i < nodes.size () && nodes[i] != nullptr ) {
180+ current->left = static_cast <SingleTreeNode*>(nodes[i]);
181+ queue.push (static_cast <SingleTreeNode*>(nodes[i]));
182+ }
183+ ++i;
184+
185+ if (i < nodes.size () && nodes[i] != nullptr ) {
186+ current->right = static_cast <SingleTreeNode*>(nodes[i]);
187+ queue.push (static_cast <SingleTreeNode*>(nodes[i]));
188+ }
189+ ++i;
190+ }
191+
192+ return root;
193+ }
194+
195+ template <typename T>
196+ std::enable_if_t <std::is_same_v<TreeNode*, T>, T> parse (std::string value) {
197+ const auto vec = parse<std::vector<SingleTreeNode*>>(std::move (value));
198+
199+ return convertToTree (vec);
200+ }
201+
132202#endif // PARSER_H
0 commit comments