Skip to content

Commit

Permalink
FeatureType from/to XMLFeature.
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergey Magidovich authored and syershov committed Mar 23, 2016
1 parent a2b10e7 commit 4c3355a
Show file tree
Hide file tree
Showing 16 changed files with 385 additions and 324 deletions.
1 change: 1 addition & 0 deletions .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ IndentWidth: 2
Language: Cpp
AccessModifierOffset: -2
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: true
AllowShortFunctionsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
Expand Down
6 changes: 3 additions & 3 deletions base/base_tests/range_iterator_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

UNIT_TEST(RangeIterator)
{
using namespace base;
using namespace my;

{
vector<int> result;
Expand Down Expand Up @@ -37,7 +37,7 @@ UNIT_TEST(RangeIterator)
}

{
TEST_EQUAL(std::vector<int>(MakeRangeIterator(0), MakeRangeIterator(5)),
(std::vector<int>{0, 1, 2, 3, 4}), ());
TEST_EQUAL(vector<int>(MakeRangeIterator(0), MakeRangeIterator(5)),
(vector<int>{0, 1, 2, 3, 4}), ());
}
}
40 changes: 23 additions & 17 deletions base/range_iterator.hpp
Original file line number Diff line number Diff line change
@@ -1,32 +1,36 @@
#include "std/iterator.hpp"
#include "std/type_traits.hpp"

namespace base
namespace my
{
// RagneItrator allows to write for loops as follows:
// for (auto const i : range(N))
// ...
// for (auto const i : range(M, N))
// ...
// And initialize stl containers like this:
// vector<int> mySequence(MakeRangeIterator(0), MakeRangeIterator(10));
template <typename TCounter>
struct RangeIterator
{
explicit RangeIterator(TCounter const current):
m_current(current)
{
}

explicit RangeIterator(TCounter const current) : m_current(current) {}
RangeIterator & operator++() { ++m_current; return *this; }
RangeIterator operator++(int) { return RangeIterator(m_current++); }
RangeIterator & operator--() { --m_current; return *this; }

RangeIterator operator--(int) { return RangeIterator(m_current--); }
bool operator==(RangeIterator const & it) const { return m_current == it.m_current; }
bool operator!=(RangeIterator const & it) const { return !(*this == it); }

TCounter operator*() const { return m_current; }

TCounter m_current;
};
} // namespace base
} // namespace my

namespace std
{
template <typename T>
struct iterator_traits<base::RangeIterator<T>>
struct iterator_traits<my::RangeIterator<T>>
{
using difference_type = T;
using value_type = T;
Expand All @@ -36,17 +40,15 @@ struct iterator_traits<base::RangeIterator<T>>
};
} // namespace std

namespace base
namespace my
{
template <typename TCounter, bool forward>
struct RangeWrapper
{

using value_type = typename std::remove_cv<TCounter>::type;
using iterator_base = RangeIterator<value_type>;
using iterator = typename std::conditional<forward,
iterator_base,
std::reverse_iterator<iterator_base>>::type;
using iterator =
typename std::conditional<forward, iterator_base, std::reverse_iterator<iterator_base>>::type;

RangeWrapper(TCounter const from, TCounter const to):
m_begin(from),
Expand All @@ -61,24 +63,28 @@ struct RangeWrapper
value_type const m_end;
};

// Use this helper to iterate through 0 to `to'.
template <typename TCounter>
RangeWrapper<TCounter, true> range(TCounter const to)
{
return {{}, to};
}

// Use this helper to iterate through `from' to `to'.
template <typename TCounter>
RangeWrapper<TCounter, true> range(TCounter const from, TCounter const to)
{
return {from, to};
}

// Use this helper to iterate through `from' to 0.
template <typename TCounter>
RangeWrapper<TCounter, false> reverse_range(TCounter const to)
RangeWrapper<TCounter, false> reverse_range(TCounter const from)
{
return {to, {}};
return {from, {}};
}

// Use this helper to iterate through `from' to `to'.
template <typename TCounter>
RangeWrapper<TCounter, false> reverse_range(TCounter const from, TCounter const to)
{
Expand All @@ -90,4 +96,4 @@ RangeIterator<TCounter> MakeRangeIterator(TCounter const counter)
{
return RangeIterator<TCounter>(counter);
}
} // namespace base
} // namespace my
24 changes: 11 additions & 13 deletions base/string_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class TokenizeIterator
move();
}

/// Use default-constructed iterator for operator == to determin an end of a token stream.
/// Use default-constructed iterator for operator == to determine an end of a token stream.
TokenizeIterator() = default;

/// Explicitly disabled, because we're storing iterators for string
Expand Down Expand Up @@ -288,16 +288,15 @@ bool IsHTML(string const & utf8);
/// Compare str1 and str2 and return if they are equal except for mismatchedSymbolsNum symbols
bool AlmostEqual(string const & str1, string const & str2, size_t mismatchedCount);

/*
template <typename ItT, typename DelimiterT>
typename ItT::value_type JoinStrings(ItT begin, ItT end, DelimiterT const & delimiter)
template <typename TIterator, typename TDelimiter>
typename TIterator::value_type JoinStrings(TIterator begin, TIterator end,
TDelimiter const & delimiter)
{
typedef typename ItT::value_type StringT;
if (begin == end)
return {};

if (begin == end) return StringT();
StringT result = *begin++;
for (ItT it = begin; it != end; ++it)
auto result = *begin++;
for (TIterator it = begin; it != end; ++it)
{
result += delimiter;
result += *it;
Expand All @@ -306,13 +305,12 @@ typename ItT::value_type JoinStrings(ItT begin, ItT end, DelimiterT const & deli
return result;
}

template <typename ContainerT, typename DelimiterT>
typename ContainerT::value_type JoinStrings(ContainerT const & container,
DelimiterT const & delimiter)
template <typename TContainer, typename TDelimiter>
typename TContainer::value_type JoinStrings(TContainer const & container,
TDelimiter const & delimiter)
{
return JoinStrings(container.begin(), container.end(), delimiter);
}
*/

template <typename TFn>
void ForEachMatched(string const & s, regex const & regex, TFn && fn)
Expand Down
2 changes: 1 addition & 1 deletion editor/editor_tests/editor_tests.pro
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ CONFIG -= app_bundle
TEMPLATE = app

ROOT_DIR = ../..
DEPENDENCIES = editor base coding geometry opening_hours pugixml
DEPENDENCIES = editor geometry coding base opening_hours pugixml

include($$ROOT_DIR/common.pri)

Expand Down
52 changes: 44 additions & 8 deletions editor/editor_tests/xml_feature_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "base/timer.hpp"

#include "std/map.hpp"
#include "std/sstream.hpp"

#include "3party/pugixml/src/pugixml.hpp"
Expand Down Expand Up @@ -58,9 +59,7 @@ UNIT_TEST(XMLFeature_Setters)

feature.SetHouse("10");
feature.SetTagValue("opening_hours", "Mo-Fr 08:15-17:30");

feature.SetType("amenity|atm");
feature.SetHeader(0xaf);
feature.SetTagValue("amenity", "atm");

stringstream sstr;
feature.Save(sstr);
Expand Down Expand Up @@ -88,14 +87,13 @@ UNIT_TEST(XMLFeature_Setters)
<tag
k="amenity"
v="atm" />
<mapswithme:header>0xaf</mapswithme:header>
</node>
)";

TEST_EQUAL(sstr.str(), expectedString, ());
}

UNIT_TEST(XMLFeatureFromXml)
UNIT_TEST(XMLFeature_FromXml)
{
auto const srcString = R"(<?xml version="1.0"?>
<node
Expand All @@ -120,7 +118,6 @@ UNIT_TEST(XMLFeatureFromXml)
<tag
k="amenity"
v="atm" />
<mapswithme:header>0xaf</mapswithme:header>
</node>
)";

Expand All @@ -144,8 +141,47 @@ UNIT_TEST(XMLFeatureFromXml)
TEST_EQUAL(feature.GetName("No such language"), "", ());

TEST_EQUAL(feature.GetTagValue("opening_hours"), "Mo-Fr 08:15-17:30", ());
TEST_EQUAL(feature.GetTagValue("amenity"), "atm", ());
TEST_EQUAL(my::TimestampToString(feature.GetModificationTime()), "2015-11-27T21:13:32Z", ());
}

UNIT_TEST(XMLFeature_ForEachName)
{
auto const srcString = R"(<?xml version="1.0"?>
<node
lat="55.7978998"
lon="37.474528"
timestamp="2015-11-27T21:13:32Z">
<tag
k="name"
v="Gorki Park" />
<tag
k="name:en"
v="Gorki Park" />
<tag
k="name:ru"
v="Парк Горького" />
<tag
k="addr:housenumber"
v="10" />
<tag
k="opening_hours"
v="Mo-Fr 08:15-17:30" />
<tag
k="amenity"
v="atm" />
</node>
)";

XMLFeature feature(srcString);
map<string, string> names;

feature.ForEachName([&names](string const & lang, string const & name)
{
names.emplace(lang, name);
});

TEST_EQUAL(feature.GetType(), "amenity|atm", ());
TEST_EQUAL(feature.GetHeader(), 0xaf, ());
TEST_EQUAL(names, (map<string, string>{
{"default", "Gorki Park"}, {"en", "Gorki Park"}, {"ru", "Парк Горького"}}),
());
}
Loading

0 comments on commit 4c3355a

Please sign in to comment.