// // Created by m on 7/27/17. // #include #include "json_helper.hpp" #include "layers.hpp" #include "util.hpp" namespace wm { surface_id_to_layer::surface_id_to_layer(nlohmann::json const &j) { DB(j); if (j["type"] == "range") { this->id_min = get(j["first_surface_id"]); this->id_max = get(j["last_surface_id"]); } else { this->id_min = this->id_max = get(j["surface_id"]); } this->name = j["name"].get(); this->layer_id = get(j["layer_id"]); } struct result to_surface_id_to_layer_map( nlohmann::json const &j) { DB(j); try { surface_id_to_layer_map stl{}; std::transform( std::cbegin(j), std::cend(j), std::inserter(stl.mapping, stl.mapping.end()), [](nlohmann::json const &j) { return surface_id_to_layer(j); }); for (auto i : stl.mapping) { if (i.name.empty()) { return Err( "Found mapping w/o name"); } if (i.layer_id == -1 || i.id_min == -1 || i.id_max == -1) { return Err( "Found invalid/unset IDs in mapping"); } } return Ok(stl); } catch (std::exception &e) { return Err(e.what()); } } // Helper to allow std::lower_bound with a int key only inline bool operator<(struct surface_id_to_layer const &a, int b) { return a.id_max < b; } optional surface_id_to_layer_map::get_layer_for_surface(int surface_id) { auto i = std::lower_bound(std::cbegin(this->mapping), std::cend(this->mapping), surface_id); if (i != this->mapping.end()) { // std::less only checks for surface_id_to_layer::id_max, so check // that we are actually inside of an interval here. if (i->id_min <= surface_id) { return optional(i->layer_id); } } return nullopt; } } // namespace wm