diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-07-16 18:26:05 -0700 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-07-16 18:26:35 -0700 |
commit | 4d1d2c5d5d4037d7e4ef91894663c49ba7f48e26 (patch) | |
tree | aeea42f16bf372b76c8e5ecf5746acb0d1086b49 /include/llmr | |
parent | a1d7da71c6f382258b2569020b50483958cfef0a (diff) | |
download | qtlocation-mapboxgl-4d1d2c5d5d4037d7e4ef91894663c49ba7f48e26.tar.gz |
separate comparisons and expressions
Diffstat (limited to 'include/llmr')
-rw-r--r-- | include/llmr/style/filter_comparison.hpp | 65 | ||||
-rw-r--r-- | include/llmr/style/filter_comparison_private.hpp | 23 | ||||
-rw-r--r-- | include/llmr/style/filter_expression.hpp | 56 | ||||
-rw-r--r-- | include/llmr/style/filter_expression_private.hpp | 14 |
4 files changed, 90 insertions, 68 deletions
diff --git a/include/llmr/style/filter_comparison.hpp b/include/llmr/style/filter_comparison.hpp new file mode 100644 index 0000000000..0e7a929e1c --- /dev/null +++ b/include/llmr/style/filter_comparison.hpp @@ -0,0 +1,65 @@ +#ifndef LLMR_STYLE_FILTER_COMPARISON +#define LLMR_STYLE_FILTER_COMPARISON + +#include <llmr/style/value.hpp> + +#include <vector> +#include <string> +#include <iosfwd> + +namespace llmr { + +class FilterComparison { +public: + enum class Operator : uint8_t { + Equal, + NotEqual, + Greater, + GreaterEqual, + Less, + LessEqual, + In, + NotIn + }; + + class Instance { + public: + Instance(Operator op, std::vector<Value> &&values) + : op(op), values(values) {} + + bool compare(const std::vector<Value> &property_values) const; + + private: + Operator op = Operator::Equal; + std::vector<Value> values; + + friend std::ostream& operator <<(std::ostream &, const Instance &); + }; + +public: + FilterComparison(const std::string &field) : field(field) {}; + + const std::string &getField() const; + template <typename Extractor> inline bool compare(const Extractor &extractor) const; + + template <typename ...Args> + inline void add(Args&& ...args) { + instances.emplace_back(::std::forward<Args>(args)...); + } + +private: + std::string field; + std::vector<Instance> instances; + + friend std::ostream& operator <<(std::ostream &, const FilterComparison &); +}; + +std::ostream& operator <<(std::ostream &s, const FilterComparison &comparison); +std::ostream& operator <<(std::ostream &s, const FilterComparison::Instance &instance); + + +FilterComparison::Operator parseFilterComparisonOperator(const std::string &op); + +} + +#endif diff --git a/include/llmr/style/filter_comparison_private.hpp b/include/llmr/style/filter_comparison_private.hpp new file mode 100644 index 0000000000..d778097730 --- /dev/null +++ b/include/llmr/style/filter_comparison_private.hpp @@ -0,0 +1,23 @@ +#ifndef LLMR_STYLE_FILTER_COMPARISON_PRIVATE +#define LLMR_STYLE_FILTER_COMPARISON_PRIVATE + +#include "filter_comparison.hpp" + +namespace llmr { + +template <typename Extractor> +inline bool FilterComparison::compare(const Extractor &extractor) const { + const std::vector<Value> values = extractor.getValues(field); + + // All instances are ANDed together. + for (const Instance &instance : instances) { + if (!instance.compare(values)) { + return false; + } + } + return true; +} + +} + +#endif diff --git a/include/llmr/style/filter_expression.hpp b/include/llmr/style/filter_expression.hpp index 97ba8c9719..db67aa43a1 100644 --- a/include/llmr/style/filter_expression.hpp +++ b/include/llmr/style/filter_expression.hpp @@ -1,67 +1,13 @@ #ifndef LLMR_STYLE_FILTER_EXPRESSION #define LLMR_STYLE_FILTER_EXPRESSION -#include <llmr/style/value.hpp> +#include <llmr/style/filter_comparison.hpp> #include <llmr/util/recursive_wrapper.hpp> -#include <vector> -#include <string> #include <iosfwd> namespace llmr { -class FilterComparison { -public: - enum class Operator : uint8_t { - Equal, - NotEqual, - Greater, - GreaterEqual, - Less, - LessEqual, - In, - NotIn - }; - - class Instance { - public: - Instance(Operator op, std::vector<Value> &&values) - : op(op), values(values) {} - - bool compare(const std::vector<Value> &property_values) const; - - private: - Operator op = Operator::Equal; - std::vector<Value> values; - - friend std::ostream& operator <<(std::ostream &, const Instance &); - }; - -public: - FilterComparison(const std::string &field) : field(field) {}; - - const std::string &getField() const; - template <typename Extractor> inline bool compare(const Extractor &extractor) const; - - template <typename ...Args> - inline void add(Args&& ...args) { - instances.emplace_back(::std::forward<Args>(args)...); - } - -private: - std::string field; - std::vector<Instance> instances; - - friend std::ostream& operator <<(std::ostream &, const FilterComparison &); -}; - -std::ostream& operator <<(std::ostream &s, const FilterComparison &comparison); -std::ostream& operator <<(std::ostream &s, const FilterComparison::Instance &instance); - - -FilterComparison::Operator parseFilterComparisonOperator(const std::string &op); - - class FilterExpression { public: typedef util::recursive_wrapper<FilterExpression> Wrapper; diff --git a/include/llmr/style/filter_expression_private.hpp b/include/llmr/style/filter_expression_private.hpp index c21fcac085..91c434e6ff 100644 --- a/include/llmr/style/filter_expression_private.hpp +++ b/include/llmr/style/filter_expression_private.hpp @@ -2,23 +2,11 @@ #define LLMR_STYLE_FILTER_EXPRESSION_PRIVATE #include "filter_expression.hpp" +#include "filter_comparison_private.hpp" namespace llmr { template <typename Extractor> -inline bool FilterComparison::compare(const Extractor &extractor) const { - const std::vector<Value> values = extractor.getValues(field); - - // All instances are ANDed together. - for (const Instance &instance : instances) { - if (!instance.compare(values)) { - return false; - } - } - return true; -} - -template <typename Extractor> bool FilterExpression::compare(const Extractor &extractor) const { if (type != GeometryType::Any && extractor.getType() != type && extractor.getType() != GeometryType::Any) { return false; |