diff options
author | Alex Zolotarev <deathbaba@gmail.com> | 2011-08-29 19:15:06 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:22:42 +0300 |
commit | a6a759b1cd73c812a63dd365a76cb672615e36ba (patch) | |
tree | 7fa1b6fc53158c6a37186023a8945452b6ccc143 /generator | |
parent | 2ae492f3a7d11ea1bac20b293a802ee6c9939f97 (diff) |
Moved osm_decl.hpp from indexer to generator
Minor include fixes
Diffstat (limited to 'generator')
-rw-r--r-- | generator/data_cache_file.hpp | 3 | ||||
-rw-r--r-- | generator/data_generator.cpp | 6 | ||||
-rw-r--r-- | generator/feature_generator.cpp | 2 | ||||
-rw-r--r-- | generator/feature_generator.hpp | 3 | ||||
-rw-r--r-- | generator/feature_sorter.hpp | 1 | ||||
-rw-r--r-- | generator/first_pass_parser.hpp | 3 | ||||
-rw-r--r-- | generator/generator.pro | 6 | ||||
-rw-r--r-- | generator/generator_tool/generator_tool.cpp | 1 | ||||
-rw-r--r-- | generator/osm_decl.cpp | 85 | ||||
-rw-r--r-- | generator/osm_decl.hpp | 137 | ||||
-rw-r--r-- | generator/osm_element.hpp | 2 |
11 files changed, 233 insertions, 16 deletions
diff --git a/generator/data_cache_file.hpp b/generator/data_cache_file.hpp index 086b70804b..b8ef6ac5ba 100644 --- a/generator/data_cache_file.hpp +++ b/generator/data_cache_file.hpp @@ -1,8 +1,9 @@ #pragma once +#include "osm_decl.hpp" + #include "../indexer/file_reader_stream.hpp" #include "../indexer/file_writer_stream.hpp" -#include "../indexer/osm_decl.hpp" #include "../coding/file_reader.hpp" #include "../coding/file_writer.hpp" diff --git a/generator/data_generator.cpp b/generator/data_generator.cpp index b02fd9551c..14cbdfb8f8 100644 --- a/generator/data_generator.cpp +++ b/generator/data_generator.cpp @@ -1,17 +1,13 @@ #include "data_generator.hpp" #include "data_cache_file.hpp" #include "first_pass_parser.hpp" - -#include "../indexer/osm_decl.hpp" +#include "osm_decl.hpp" #include "../base/std_serialization.hpp" #include "../base/logging.hpp" #include "../std/bind.hpp" -#include "../base/start_mem_debug.hpp" - - namespace data { diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp index c7bbabe577..5e8dbdd292 100644 --- a/generator/feature_generator.cpp +++ b/generator/feature_generator.cpp @@ -2,11 +2,11 @@ #include "data_cache_file.hpp" #include "osm_element.hpp" #include "polygonizer.hpp" +#include "osm_decl.hpp" #include "../defines.hpp" #include "../indexer/data_header.hpp" -#include "../indexer/osm_decl.hpp" #include "../indexer/mercator.hpp" #include "../indexer/cell_id.hpp" diff --git a/generator/feature_generator.hpp b/generator/feature_generator.hpp index c57662bd12..f775c3c45d 100644 --- a/generator/feature_generator.hpp +++ b/generator/feature_generator.hpp @@ -1,8 +1,7 @@ #pragma once #include "generate_info.hpp" - -#include "../indexer/osm_decl.hpp" +#include "osm_decl.hpp" #include "../geometry/rect2d.hpp" diff --git a/generator/feature_sorter.hpp b/generator/feature_sorter.hpp index f64d55f612..39e2c60a35 100644 --- a/generator/feature_sorter.hpp +++ b/generator/feature_sorter.hpp @@ -7,7 +7,6 @@ #include "../indexer/scales.hpp" #include "../std/string.hpp" -#include "../std/vector.hpp" namespace feature { diff --git a/generator/first_pass_parser.hpp b/generator/first_pass_parser.hpp index 0d115e59c4..a38e879beb 100644 --- a/generator/first_pass_parser.hpp +++ b/generator/first_pass_parser.hpp @@ -1,13 +1,12 @@ #pragma once #include "xml_element.hpp" +#include "osm_decl.hpp" -#include "../indexer/osm_decl.hpp" #include "../indexer/mercator.hpp" #include "../base/string_utils.hpp" - template <class THolder> class FirstPassParser : public BaseOSMParser { diff --git a/generator/generator.pro b/generator/generator.pro index aee3bda4e6..48e3d60df6 100644 --- a/generator/generator.pro +++ b/generator/generator.pro @@ -27,7 +27,8 @@ SOURCES += \ mwm_rect_updater.cpp \ dumper.cpp \ unpack_mwm.cpp \ - feature_builder.cpp + feature_builder.cpp \ + osm_decl.cpp \ HEADERS += \ feature_merger.hpp \ @@ -52,4 +53,5 @@ HEADERS += \ dumper.hpp \ generate_info.hpp \ unpack_mwm.hpp \ - feature_builder.hpp + feature_builder.hpp \ + osm_decl.hpp \ diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 89658ff38f..2c1e7046b2 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -13,7 +13,6 @@ #include "../../indexer/data_header.hpp" #include "../../indexer/features_vector.hpp" #include "../../indexer/index_builder.hpp" -#include "../../indexer/osm_decl.hpp" #include "../../indexer/search_index_builder.hpp" #include "../../defines.hpp" diff --git a/generator/osm_decl.cpp b/generator/osm_decl.cpp new file mode 100644 index 0000000000..9a39f6cbfd --- /dev/null +++ b/generator/osm_decl.cpp @@ -0,0 +1,85 @@ +#include "osm_decl.hpp" + +#include "../indexer/classificator.hpp" + +#include "../base/macros.hpp" + +#include "../std/target_os.hpp" + +namespace feature +{ + char const * arrUnite[1][2] = { { "natural", "coastline" } }; + + bool NeedUnite(string const & k, string const & v) + { + for (size_t i = 0; i < ARRAY_SIZE(arrUnite); ++i) + if (k == arrUnite[i][0] && v == arrUnite[i][1]) + return true; + + return false; + } + + bool NeedUnite(uint32_t type) + { + static uint32_t arrTypes[1] = { 0 }; + + if (arrTypes[0] == 0) + { + // initialize static array + for (size_t i = 0; i < ARRAY_SIZE(arrUnite); ++i) + { + size_t const count = ARRAY_SIZE(arrUnite[i]); + vector<string> path(count); + for (size_t j = 0; j < count; ++j) + path[j] = arrUnite[i][j]; + + arrTypes[i] = classif().GetTypeByPath(path); + } + } + + for (size_t i = 0; i < ARRAY_SIZE(arrTypes); ++i) + if (arrTypes[i] == type) + return true; + + return false; + } +} + +void progress_policy::Begin(string const & /*name*/, size_t factor) +{ + m_count = 0; + m_factor = factor; +//#ifndef OMIM_OS_BADA +// cout << "Progress of " << name << " started" << endl; +//#endif +} + +void progress_policy::Inc(size_t i /* = 1 */) +{ + m_count += i; +//#ifndef OMIM_OS_BADA +// if (m_count % m_factor == 0) +// cout << '.'; +//#endif +} + +void progress_policy::End() +{ +} + +string RelationElement::GetType() const +{ + map<string, string>::const_iterator i = tags.find("type"); + return ((i != tags.end()) ? i->second : string()); +} + +bool RelationElement::FindWay(uint64_t id, string & role) const +{ + for (size_t i = 0; i < ways.size(); ++i) + if (ways[i].first == id) + { + role = ways[i].second; + return true; + } + return false; +} diff --git a/generator/osm_decl.hpp b/generator/osm_decl.hpp new file mode 100644 index 0000000000..f438ccfa90 --- /dev/null +++ b/generator/osm_decl.hpp @@ -0,0 +1,137 @@ +#pragma once + +#include "../base/std_serialization.hpp" +#include "../base/assert.hpp" + +#include "../std/utility.hpp" +#include "../std/vector.hpp" +#include "../std/string.hpp" +#include "../std/algorithm.hpp" +#include "../std/bind.hpp" + + +/// Used to store all world nodes inside temporary index file. +/// To find node by id, just calculate offset inside index file: +/// offset_in_file = sizeof(LatLon) * node_ID +struct LatLon +{ + double lat; + double lon; +}; +STATIC_ASSERT(sizeof(LatLon) == 16); + +struct LatLonPos +{ + uint64_t pos; + double lat; + double lon; +}; +STATIC_ASSERT(sizeof(LatLonPos) == 24); + +#define NODES_FILE "nodes.dat" +#define WAYS_FILE "ways.dat" +#define RELATIONS_FILE "relations.dat" +#define OFFSET_EXT ".offs" +#define ID2REL_EXT ".id2rel" +#define MAPPED_WAYS "mapped_ways.n2w" + + +namespace feature +{ + /// @name Need to unite features. + //@{ + /// @param[in] k, v Key and Value from relation tags. + bool NeedUnite(string const & k, string const & v); + /// @param[in] type Type from feature. + bool NeedUnite(uint32_t type); + //@} +} + +class progress_policy +{ + size_t m_count; + size_t m_factor; + +public: + size_t GetCount() const { return m_count; } + + void Begin(string const &, size_t factor); + void Inc(size_t i = 1); + void End(); +}; + +struct WayElement +{ + vector<uint64_t> nodes; + uint64_t m_wayOsmId; + + explicit WayElement(uint64_t osmId) : m_wayOsmId(osmId) {} + + bool IsValid() const { return !nodes.empty(); } + + uint64_t GetOtherEndPoint(uint64_t id) const + { + if (id == nodes.front()) + return nodes.back(); + else + { + ASSERT ( id == nodes.back(), () ); + return nodes.front(); + } + } + + template <class ToDo> void ForEachPoint(ToDo & toDo) const + { + for_each(nodes.begin(), nodes.end(), bind<void>(ref(toDo), _1)); + } + + template <class ToDo> void ForEachPointOrdered(uint64_t start, ToDo & toDo) + { + if (start == nodes.front()) + for_each(nodes.begin(), nodes.end(), bind<void>(ref(toDo), _1)); + else + for_each(nodes.rbegin(), nodes.rend(), bind<void>(ref(toDo), _1)); + } +}; + +struct RelationElement +{ + typedef vector<pair<uint64_t, string> > ref_vec_t; + ref_vec_t nodes, ways; + map<string, string> tags; + + bool IsValid() const { return !(nodes.empty() && ways.empty()); } + + string GetType() const; + bool FindWay(uint64_t id, string & role) const; + + template <class ToDo> void ForEachWay(ToDo & toDo) const + { + for (size_t i = 0; i < ways.size(); ++i) + toDo(ways[i].first, ways[i].second); + } +}; + +template <class TArchive> TArchive & operator << (TArchive & ar, WayElement const & e) +{ + ar << e.nodes; + return ar; +} + +template <class TArchive> TArchive & operator >> (TArchive & ar, WayElement & e) +{ + ar >> e.nodes; + return ar; +} + +template <class TArchive> TArchive & operator << (TArchive & ar, RelationElement const & e) +{ + ar << e.nodes << e.ways << e.tags; + return ar; +} + +template <class TArchive> TArchive & operator >> (TArchive & ar, RelationElement & e) +{ + ar >> e.nodes >> e.ways >> e.tags; + return ar; +} diff --git a/generator/osm_element.hpp b/generator/osm_element.hpp index 037ee83e0a..01164a1fcc 100644 --- a/generator/osm_element.hpp +++ b/generator/osm_element.hpp @@ -3,8 +3,8 @@ #include "osm2type.hpp" #include "xml_element.hpp" #include "feature_builder.hpp" +#include "osm_decl.hpp" -#include "../indexer/osm_decl.hpp" #include "../indexer/feature_visibility.hpp" #include "../base/string_utils.hpp" |