diff options
author | Alex Zolotarev <deathbaba@gmail.com> | 2010-12-05 19:24:16 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-22 22:33:57 +0300 |
commit | d6e12b7ce4bcbf0ccd1c07eb25de143422913c34 (patch) | |
tree | a7e910c330ce4da9b4f2d8be76067adece2561c4 /indexer/tree_structure.hpp |
One Month In Minsk. Made in Belarus.
Diffstat (limited to 'indexer/tree_structure.hpp')
-rw-r--r-- | indexer/tree_structure.hpp | 103 |
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; + } +} |