Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rips out dead code from the container.hpp and creates for_each_pair.hpp #1882

Merged
merged 1 commit into from
Jan 11, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/contractor/contractor_options.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ enum class return_code : unsigned

struct ContractorConfig
{
ContractorConfig() noexcept : requested_num_threads(0) {}
ContractorConfig() : requested_num_threads(0) {}

boost::filesystem::path config_file_path;
boost::filesystem::path osrm_input_path;
Expand Down
2 changes: 1 addition & 1 deletion include/engine/guidance/segment_list.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include "engine/segment_information.hpp"
#include "util/integer_range.hpp"
#include "util/coordinate_calculation.hpp"
#include "util/container.hpp"
#include "util/for_each_pair.hpp"
#include "extractor/turn_instructions.hpp"

#include <boost/assert.hpp>
Expand Down
1 change: 1 addition & 0 deletions include/engine/plugins/viaroute.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "engine/api_response_generator.hpp"
#include "engine/object_encoder.hpp"
#include "engine/search_engine.hpp"
#include "util/for_each_pair.hpp"
#include "util/integer_range.hpp"
#include "util/json_renderer.hpp"
#include "util/make_unique.hpp"
Expand Down
15 changes: 9 additions & 6 deletions include/engine/routing_algorithms/alternative_path.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
#include "engine/routing_algorithms/routing_base.hpp"
#include "engine/search_engine_data.hpp"
#include "util/integer_range.hpp"
#include "util/container.hpp"

#include <boost/assert.hpp>

#include <algorithm>
#include <iterator>
#include <unordered_map>
#include <unordered_set>

Expand Down Expand Up @@ -148,7 +149,9 @@ class AlternativeRouting final
return;
}

util::sort_unique_resize(via_node_candidate_list);
std::sort(begin(via_node_candidate_list), end(via_node_candidate_list));
auto unique_end = std::unique(begin(via_node_candidate_list), end(via_node_candidate_list));
via_node_candidate_list.resize(unique_end - begin(via_node_candidate_list));

std::vector<NodeID> packed_forward_path;
std::vector<NodeID> packed_reverse_path;
Expand Down Expand Up @@ -439,10 +442,10 @@ class AlternativeRouting final
partially_unpacked_shortest_path.size())) -
1;
for (int64_t current_node = 0; (current_node < packed_path_length) &&
(partially_unpacked_via_path[current_node] ==
partially_unpacked_shortest_path[current_node] &&
partially_unpacked_via_path[current_node + 1] ==
partially_unpacked_shortest_path[current_node + 1]);
(partially_unpacked_via_path[current_node] ==
partially_unpacked_shortest_path[current_node] &&
partially_unpacked_via_path[current_node + 1] ==
partially_unpacked_shortest_path[current_node + 1]);
++current_node)
{
EdgeID selected_edge =
Expand Down
2 changes: 1 addition & 1 deletion include/extractor/extractor_options.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ enum class return_code : unsigned

struct ExtractorConfig
{
ExtractorConfig() noexcept : requested_num_threads(0) {}
ExtractorConfig() : requested_num_threads(0) {}
boost::filesystem::path config_file_path;
boost::filesystem::path input_path;
boost::filesystem::path profile_path;
Expand Down
73 changes: 2 additions & 71 deletions include/util/container.hpp
Original file line number Diff line number Diff line change
@@ -1,79 +1,11 @@
#ifndef CONTAINER_HPP
#define CONTAINER_HPP

#include <algorithm>
#include <iterator>
#include <vector>

namespace osrm
{
namespace util
{

namespace detail
{
// Culled by SFINAE if reserve does not exist or is not accessible
template <typename T>
constexpr auto has_resize_method(T &t) noexcept -> decltype(t.resize(0), bool())
{
return true;
}

// Used as fallback when SFINAE culls the template method
constexpr bool has_resize_method(...) noexcept { return false; }
}

template <typename Container> void sort_unique_resize(Container &vector) noexcept
{
std::sort(std::begin(vector), std::end(vector));
const auto number_of_unique_elements =
std::unique(std::begin(vector), std::end(vector)) - std::begin(vector);
if (detail::has_resize_method(vector))
{
vector.resize(number_of_unique_elements);
}
}

// template <typename T> inline void sort_unique_resize_shrink_vector(std::vector<T> &vector)
// {
// sort_unique_resize(vector);
// vector.shrink_to_fit();
// }

// template <typename T> inline void remove_consecutive_duplicates_from_vector(std::vector<T>
// &vector)
// {
// const auto number_of_unique_elements = std::unique(vector.begin(), vector.end()) -
// vector.begin();
// vector.resize(number_of_unique_elements);
// }

template <typename ForwardIterator, typename Function>
Function for_each_pair(ForwardIterator begin, ForwardIterator end, Function function)
{
if (begin == end)
{
return function;
}

auto next = begin;
next = std::next(next);

while (next != end)
{
function(*begin, *next);
begin = std::next(begin);
next = std::next(next);
}
return function;
}

template <class ContainerT, typename Function>
Function for_each_pair(ContainerT &container, Function function)
{
return for_each_pair(std::begin(container), std::end(container), function);
}

template <class Container> void append_to_container(Container &&) {}

template <class Container, typename T, typename... Args>
Expand All @@ -82,8 +14,7 @@ void append_to_container(Container &&container, T value, Args &&... args)
container.emplace_back(value);
append_to_container(std::forward<Container>(container), std::forward<Args>(args)...);
}

} // namespace osrm
}
}

#endif /* CONTAINER_HPP */
#endif
45 changes: 45 additions & 0 deletions include/util/for_each_pair.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef FOR_EACH_PAIR_HPP
#define FOR_EACH_PAIR_HPP

#include <numeric>
#include <iterator>

namespace osrm
{
namespace util
{

// TODO: check why this is not an option here:
// std::adjacent_find(begin, end, [=](const auto& l, const auto& r){ return function(), false; });
template <typename ForwardIterator, typename Function>
Function for_each_pair(ForwardIterator begin, ForwardIterator end, Function function)
{
if (begin == end)
{
return function;
}

auto next = begin;
next = std::next(next);

while (next != end)
{
function(*begin, *next);
begin = std::next(begin);
next = std::next(next);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just nit-pitting, but I've read somewhere that it would be best to bring these kind of functions into the namespace (using std::next) so that the compiler can decide which next to use, if there should be some better fitting one.
Just as you've done below for begin and end.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm for begin / end I can understand the need for Koenig lookup (so that it e.g. works on raw arrays); next should eventually dispatch to operator++ (for forward iterators), and that the iterator concept guarantees for and lets the user implement it in any way she wishes.

}
return function;
}

template <class ContainerT, typename Function>
Function for_each_pair(ContainerT &container, Function function)
{
using std::begin;
using std::end;
return for_each_pair(begin(container), end(container), function);
}

} // namespace util
} // namespace osrm

#endif /* FOR_EACH_PAIR_HPP */
2 changes: 2 additions & 0 deletions include/util/json_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define JSON_UTIL_HPP

#include "osrm/json_container.hpp"
#include "util/container.hpp"

#include <cmath>
#include <limits>
Expand Down Expand Up @@ -31,6 +32,7 @@ template <typename T> T clamp_float(T 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;
}
Expand Down
2 changes: 1 addition & 1 deletion src/extractor/extractor_callbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

#include "extractor/external_memory_node.hpp"
#include "extractor/restriction.hpp"
#include "util/container.hpp"
#include "util/simple_logger.hpp"
#include "util/for_each_pair.hpp"

#include <boost/optional/optional.hpp>

Expand Down