From d6e12b7ce4bcbf0ccd1c07eb25de143422913c34 Mon Sep 17 00:00:00 2001 From: Alex Zolotarev Date: Sun, 5 Dec 2010 19:24:16 +0300 Subject: One Month In Minsk. Made in Belarus. --- indexer/tree_structure.hpp | 103 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 indexer/tree_structure.hpp (limited to 'indexer/tree_structure.hpp') 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 + 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 + void SaveTreeAsText(ostream & s, ToDo & toDo) + { + detail::PrintTextTree(0, s, toDo); + } + + template + 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; + } +} -- cgit v1.2.3