/srv/osrm/osrm-backend/include/util
NameSizeModeActions
guidance/-0755rm
alias.hpp68700644editdlrm
assert.hpp19640644editdlrm
attributes.hpp3570644editdlrm
bearing.hpp39640644editdlrm
bit_range.hpp29500644editdlrm
cheap_ruler.hpp21240644editdlrm
concurrent_id_map.hpp21480644editdlrm
conditional_restrictions.hpp6270644editdlrm
connectivity_checksum.hpp19310644editdlrm
coordinate.hpp92440644editdlrm
coordinate_calculation.hpp162970644editdlrm
deallocating_vector.hpp112050644editdlrm
debug.hpp59580644editdlrm
dist_table_wrapper.hpp22990644editdlrm
dynamic_graph.hpp159510644editdlrm
exception.hpp51260644editdlrm
exception_utils.hpp6090644editdlrm
exclude_flag.hpp9750644editdlrm
filtered_graph.hpp54020644editdlrm
filtered_integer_range.hpp30970644editdlrm
fingerprint.hpp11660644editdlrm
for_each_indexed.hpp6340644editdlrm
for_each_pair.hpp9900644editdlrm
for_each_range.hpp4770644editdlrm
geojson_debug_logger.hpp63300644editdlrm
geojson_debug_policies.hpp18100644editdlrm
geojson_debug_policy_toolkit.hpp32580644editdlrm
geojson_validation.hpp28990644editdlrm
graph_traits.hpp12450644editdlrm
graph_utils.hpp31410644editdlrm
group_by.hpp7220644editdlrm
hilbert_value.hpp30100644editdlrm
indexed_data.hpp150390644editdlrm
integer_range.hpp32860644editdlrm
isatty.hpp6100644editdlrm
json_container.hpp31810644editdlrm
json_deep_compare.hpp47320644editdlrm
json_renderer.hpp41600644editdlrm
json_util.hpp5440644editdlrm
log.hpp21870644editdlrm
lua_util.hpp8910644editdlrm
matrix_graph_wrapper.hpp12940644editdlrm
meminfo.hpp6600644editdlrm
mmap_file.hpp27760644editdlrm
mmap_tar.hpp10070644editdlrm
msb.hpp11780644editdlrm
node_based_graph.hpp35300644editdlrm
opening_hours.hpp83380644editdlrm
packed_vector.hpp216910644editdlrm
percent.hpp21060644editdlrm
permutation.hpp19910644editdlrm
query_heap.hpp102050644editdlrm
range_table.hpp71190644editdlrm
rectangle.hpp59000644editdlrm
serialization.hpp59020644editdlrm
static_assert.hpp6400644editdlrm
static_graph.hpp107020644editdlrm
static_rtree.hpp341470644editdlrm
std_hash.hpp10350644editdlrm
string_util.hpp34000644editdlrm
tarjan_scc.hpp66460644editdlrm
timed_histogram.hpp25760644editdlrm
timezones.hpp14170644editdlrm
timing_util.hpp14850644editdlrm
to_osm_link.hpp6940644editdlrm
trigonometry_table.hpp359060644editdlrm
typedefs.hpp76270644editdlrm
vector_tile.hpp3030644editdlrm
vector_view.hpp80000644editdlrm
version.hpp.in4060644editdlrm
viewport.hpp15790644editdlrm
web_mercator.hpp64800644editdlrm
xor_fast_hash.hpp17970644editdlrm
xor_fast_hash_storage.hpp21950644editdlrm
Edit: /srv/osrm/osrm-backend/include/util/geojson_debug_logger.hpp (6330B)
#ifndef OSRM_GEOJSON_DEBUG_LOGGER_HPP #define OSRM_GEOJSON_DEBUG_LOGGER_HPP #include #include #include #include #include "util/exception.hpp" #include "util/json_container.hpp" #include "util/json_renderer.hpp" #include "util/log.hpp" namespace osrm::util { // in case we want to do scenario-based logging, we can specify a dedicated logging scenario to be // able to use multiple files for the same converter enum class LoggingScenario { eDefault = 0 }; // forward declaration to become friends template class ScopedGeojsonLoggerGuard; // a geojson logger requires a conversion policy to transfer arbitrary input into viable geojson. // features of the same kind are stored in the same geojson file template class GeojsonLogger { // become friends with the guard friend class ScopedGeojsonLoggerGuard; // having these private enforces the guard to be used to initialise/close/write private: // cannot lock, is tooling for locked function static void output(bool first, const util::json::Object &object) { if (!first) ofs << ",\n\t\t"; // objects are simply forwarded util::json::render(ofs, object); } // cannot lock, is tooling for locked function static void output(bool first, const util::json::Array &array) { for (const auto &object : array.values) { if (!first) ofs << ",\n\t\t"; util::json::render(ofs, object.get()); first = false; } } // writes a single feature into the Geojson file template static bool Write(Args &&... args) { // make sure to syncronize logging output, our writing should be sequential std::lock_guard guard(lock); // if there is no logfile, we cannot write (possible reason: the guard might be out of scope // (e.g. if it is anonymous)) if (!ofs.is_open() || (nullptr == policy)) { throw util::exception("Trying to use the geojson printer without an open logger."); } // use our policy to convert the arguments into geojson, this can be done in parallel const auto json_object = (*policy)(std::forward(args)...); // different features are separated by `,` // since we are not building a full json collection of features, we have to do some of the // bookeeping ourselves. This prevens us from doing one huge json object, if we are // processing larger results output(first, json_object); first = false; return static_cast(ofs); } // Opening a logger, we initialize a geojson feature collection // to be later filled with additional data static bool Open(const std::string &logfile) { // if a file is open, close it off. When this function returns, there should be an open // logfile. However, there is a brief period between closing and openen where we could miss // out on log output. Such a sad life if (ofs.is_open()) { util::Log(logWARNING) << "Overwriting " << logfile << ". Is this desired behaviour? If this message occurs more than once rethink the " "location of your Logger Guard."; Close(); } // make sure to syncronize logging output, cannot be locked earlier, since Close also locks // and we don't want deadlocks std::lock_guard guard(lock); ofs.open(logfile, std::ios::binary); ofs << std::setprecision(12); // set up a feature collection ofs << "{\n\t\"type\": \"FeatureCollection\",\n\t\"features\": [\n\t"; // remember whether we need to output a colon first = true; return static_cast(ofs); } // finalising touches on the GeoJson static bool Close() { // make sure to syncronize logging output std::lock_guard guard(lock); // finishe the geojson feature collection and close it all off if (ofs.is_open()) { ofs << "\n\t]\n}"; ofs.close(); } return static_cast(ofs); } static void SetPolicy(geojson_conversion_policy *new_policy) { policy = new_policy; } private: static bool first; static std::mutex lock; static std::ofstream ofs; static geojson_conversion_policy *policy; }; // make sure to do opening and closing of our guard template class ScopedGeojsonLoggerGuard { public: template ScopedGeojsonLoggerGuard(const std::string &logfile, Args &&... args) : policy(std::forward(args)...) { GeojsonLogger::Open(logfile); GeojsonLogger::SetPolicy(&policy); } ~ScopedGeojsonLoggerGuard() { GeojsonLogger::Close(); GeojsonLogger::SetPolicy(nullptr); } template static bool Write(Args &&... args) { return GeojsonLogger::Write( std::forward(args)...); } private: geojson_conversion_policy policy; }; template bool GeojsonLogger::first; template std::mutex GeojsonLogger::lock; template std::ofstream GeojsonLogger::ofs; template geojson_conversion_policy *GeojsonLogger::policy; } // namespace osrm::util #endif /* OSRM_GEOJSON_DEBUG_LOGGER_HPP */