osrm-backend/include/util/json_util.hpp
Daniel J. Hofmann c93ca02fb8 Rips out dead code from the container.hpp and creates for_each_pai.hpp
I added two TODOs that I would like to address in the future.
2016-01-11 20:14:35 +01:00

81 lines
1.8 KiB
C++

#ifndef JSON_UTIL_HPP
#define JSON_UTIL_HPP
#include "osrm/json_container.hpp"
#include "util/container.hpp"
#include <cmath>
#include <limits>
namespace osrm
{
namespace util
{
namespace json
{
// Make sure we don't have inf and NaN values
template <typename T> T clamp_float(T d)
{
if (std::isnan(d) || std::numeric_limits<T>::infinity() == d)
{
return std::numeric_limits<T>::max();
}
if (-std::numeric_limits<T>::infinity() == d)
{
return std::numeric_limits<T>::lowest();
}
return d;
}
template <typename... Args> Array make_array(Args... args)
{
Array a;
// TODO: check why a.values.emplace_back(args...); is not an option here
append_to_container(a.values, args...);
return a;
}
template <typename T> Array make_array(const std::vector<T> &vector)
{
Array a;
for (const auto &v : vector)
{
a.values.emplace_back(v);
}
return a;
}
// template specialization needed as clang does not play nice
template <> Array make_array(const std::vector<bool> &vector)
{
Array a;
for (const bool v : vector)
{
a.values.emplace_back(v);
}
return a;
}
// Easy acces to object hierachies
Value &get(Value &value) { return value; }
template <typename... Keys> Value &get(Value &value, const char *key, Keys... keys)
{
using recursive_object_t = mapbox::util::recursive_wrapper<Object>;
return get(value.get<recursive_object_t>().get().values[key], keys...);
}
template <typename... Keys> Value &get(Value &value, unsigned key, Keys... keys)
{
using recursive_array_t = mapbox::util::recursive_wrapper<Array>;
return get(value.get<recursive_array_t>().get().values[key], keys...);
}
} // namespace json
} // namespace util
} // namespace osrm
#endif // JSON_UTIL_HPP