Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Zolotarev <deathbaba@gmail.com>2010-12-05 19:24:16 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-22 22:33:57 +0300
commitd6e12b7ce4bcbf0ccd1c07eb25de143422913c34 (patch)
treea7e910c330ce4da9b4f2d8be76067adece2561c4 /indexer/tree_structure.hpp
One Month In Minsk. Made in Belarus.
Diffstat (limited to 'indexer/tree_structure.hpp')
-rw-r--r--indexer/tree_structure.hpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/indexer/tree_structure.hpp b/indexer/tree_structure.hpp
new file mode 100644
index 0000000000..540d6bd428
--- /dev/null
+++ b/indexer/tree_structure.hpp
@@ -0,0 +1,103 @@
+#pragma once
+
+#include "../base/assert.hpp"
+
+#include "../std/fstream.hpp"
+#include "../std/sstream.hpp"
+
+namespace tree
+{
+ namespace detail
+ {
+ void PrintOffset(size_t offset, ostream & s)
+ {
+ for (size_t i = 0; i < offset; ++i)
+ s << " ";
+ }
+
+ template <class ToDo>
+ void PrintTextTree(size_t offset, ostream & s, ToDo & toDo)
+ {
+ PrintOffset(offset, s);
+
+ // print name as key
+ s << toDo.Name() << " ";
+
+ // serialize object
+ toDo.Serialize(s);
+
+ size_t const count = toDo.BeginChilds();
+ bool const isEmpty = (count == 0);
+
+ // put end marker
+ s << (isEmpty ? "-" : "+") << endl;
+
+ // print chils
+ if (!isEmpty)
+ {
+ offset += 4;
+
+ size_t i = 0;
+ while (i < count)
+ {
+ toDo.Start(i++);
+ PrintTextTree(offset, s, toDo);
+ toDo.End();
+ }
+
+ // end of structure
+ PrintOffset(offset, s);
+ s << "{}" << endl;
+ }
+ }
+ }
+
+ template <class ToDo>
+ void SaveTreeAsText(ostream & s, ToDo & toDo)
+ {
+ detail::PrintTextTree(0, s, toDo);
+ }
+
+ template <class ToDo>
+ bool LoadTreeAsText(istringstream & s, ToDo & toDo)
+ {
+ string name;
+ s >> name;
+ ASSERT ( !name.empty(), ("Error in classificator file") );
+ if (name == "{}") return false;
+
+ // set key name
+ toDo.Name(name);
+
+ // load object itself
+ string strkey;
+ s >> strkey;
+ while (strkey != "+" && strkey != "-")
+ {
+ toDo.Serialize(strkey);
+ s >> strkey;
+ }
+
+ // load children
+ if (strkey == "+")
+ {
+ size_t i = 0;
+ while (true)
+ {
+ toDo.Start(i++);
+ bool const isContinue = LoadTreeAsText(s, toDo);
+ toDo.End();
+
+ if (!isContinue)
+ {
+ toDo.EndChilds();
+ break;
+ }
+ }
+
+ ASSERT ( i <= 64, ("too many features at level = ", name) );
+ }
+
+ return true;
+ }
+}