summaryrefslogtreecommitdiff
path: root/platform/darwin/src/MGLValueEvaluator.h
blob: 2779deba90264b4cf78f53fa08de831bb9743e53 (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
#import <Foundation/Foundation.h>

#import <mbgl/util/geometry.hpp>

/**
 Recursively transforms a C++ type into the corresponding Foundation type.
 */
class ValueEvaluator {
public:
    id operator()(const mbgl::NullValue &) const {
        return [NSNull null];
    }

    id operator()(const bool &value) const {
        return value ? @YES : @NO;
    }

    id operator()(const uint64_t &value) const {
        return @(value);
    }

    id operator()(const int64_t &value) const {
        return @(value);
    }

    id operator()(const double &value) const {
        return @(value);
    }

    id operator()(const std::string &value) const {
        return @(value.c_str());
    }

    id operator()(const std::vector<mbgl::Value> &values) const {
        NSMutableArray *objects = [NSMutableArray arrayWithCapacity:values.size()];
        for (const auto &v : values) {
            [objects addObject:mbgl::Value::visit(v, *this)];
        }
        return objects;
    }

    id operator()(const std::unordered_map<std::string, mbgl::Value> &items) const {
        NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:items.size()];
        for (auto &item : items) {
            attributes[@(item.first.c_str())] = mbgl::Value::visit(item.second, *this);
        }
        return attributes;
    }
};