summaryrefslogtreecommitdiff
path: root/src/style/filter_expression.cpp
blob: ff4073b129287767048dd132460d558472e368e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <mbgl/style/filter_expression_private.hpp>
#include <mbgl/map/vector_tile.hpp>

#include <mbgl/style/value_comparison.hpp>

#include <ostream>

namespace mbgl {

std::ostream& operator <<(std::ostream &s, FilterExpression::Operator op) {
    switch (op) {
        case FilterExpression::Operator::And: s << "AND"; break;
        case FilterExpression::Operator::Or: s << "OR"; break;
        case FilterExpression::Operator::Xor: s << "XOR"; break;
        case FilterExpression::Operator::Nor: s << "NOR"; break;
    }
    return s;
}


std::ostream& operator <<(std::ostream &s, FilterExpression::GeometryType type) {
    switch (type) {
        case FilterExpression::GeometryType::Point: s << "Point"; break;
        case FilterExpression::GeometryType::LineString: s << "LineString"; break;
        case FilterExpression::GeometryType::Polygon: s << "Polygon"; break;
        case FilterExpression::GeometryType::Any: s << "<Any>"; break;
    }
    return s;
}

bool FilterExpression::empty() const {
    return type == GeometryType::Any && comparisons.empty() && expressions.empty();
}

void FilterExpression::add(const FilterComparison &comparison) {
    comparisons.emplace_back(comparison);
}

void FilterExpression::add(const FilterExpression &expression) {
    expressions.emplace_back(expression);
}

void FilterExpression::setGeometryType(GeometryType g) {
    type = g;
}

FilterExpression::GeometryType parseGeometryType(const std::string &geometry) {
    if (geometry == "Point") return FilterExpression::GeometryType::Point;
    if (geometry == "LineString") return FilterExpression::GeometryType::LineString;
    if (geometry == "Polygon") return FilterExpression::GeometryType::Polygon;
    return FilterExpression::GeometryType::Any;
}

std::ostream& operator <<(std::ostream &s, const FilterExpression &expression) {
    s << "expression " << expression.op << std::endl;
    s << " - $type = " << expression.type << std::endl;
    for (const FilterComparison &comparison : expression.comparisons) {
        s << comparison;
    }
    s << "end expression" << std::endl;
    return s;
}

template bool FilterExpression::compare(const VectorTileTagExtractor &extractor) const;

}