Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
CollectionConcepts.hpp
Go to the documentation of this file.
1#pragma once
2#include <ranges>
3#include <concepts>
4#include <vector>
5#include <unordered_set>
6
7namespace fishnet::util{
15template<auto C, typename T>
16concept Satisfies = requires {
17 C.template operator()<T>();
18};
19
20template<typename R,typename T>
21concept range_of = std::ranges::range<R> && std::convertible_to<std::ranges::range_value_t<R>,T>;
22
23template<typename R, auto C>
24concept range_over = std::ranges::range<R> && Satisfies<C,std::ranges::range_value_t<R>>;
25
26template<typename R,typename T>
27concept forward_range_of = std::ranges::forward_range<R> && range_of<R,T>;
28
29template<typename R, auto C>
30concept forward_range_over = std::ranges::forward_range<R> && range_over<R,C>;
31
32template<typename R, typename T>
33concept input_range_of = std::ranges::input_range<R> && range_of<R,T>;
34
35template<typename R,auto C>
36concept input_range_over = std::ranges::input_range<R> && range_over<R,C>;
37
38template<typename R, typename T>
39concept random_access_range_of = std::ranges::random_access_range<R> && range_of<R,T>;
40
41template<typename R, auto C>
42concept random_access_range_over = std::ranges::random_access_range<R> && range_over<R,C>;
43
44template<typename V, typename T>
45concept view_of = std::ranges::view<V> && range_of<V,T>;
46
47template<typename V, auto C>
48concept view_over = std::ranges::view<V> && range_over<V,C>;
49
50constexpr size_t size(std::ranges::range auto && range) noexcept{
51 using R = std::remove_cvref_t<decltype(range)>;
52 if constexpr(std::ranges::sized_range<R>){
53 return static_cast<size_t>(std::ranges::size(range));
54 }else {
55 return static_cast<size_t>(std::ranges::distance(range));
56 }
57}
58
59constexpr inline bool isEmpty(std::ranges::range auto && range) noexcept {
60 return size(range) == 0;
61}
62
63template<std::ranges::range R>
64constexpr auto toVector(R&& range) {
65 std::vector<std::ranges::range_value_t<R>> vec;
66 for (auto&& elem : range) {
67 vec.push_back(std::forward<decltype(elem)>(elem));
68 }
69 return vec;
70}
71
72template<std::ranges::range R>
73constexpr auto toUnorderedSet(R&& range) {
74 std::unordered_set<std::ranges::range_value_t<R>> set;
75 for (auto&& elem : range) {
76 set.insert(std::forward<decltype(elem)>(elem));
77 }
78 return set;
79}
80} // fishnet::util
Metaprogramming Helper which checks whether a concept is satisfied (Futher information can found here...
Definition CollectionConcepts.hpp:16
Definition CollectionConcepts.hpp:27
Definition CollectionConcepts.hpp:30
Definition CollectionConcepts.hpp:33
Definition CollectionConcepts.hpp:36
Definition CollectionConcepts.hpp:39
Definition CollectionConcepts.hpp:42
Definition CollectionConcepts.hpp:21
Definition CollectionConcepts.hpp:24
Definition CollectionConcepts.hpp:45
Definition CollectionConcepts.hpp:48
Definition AlternativeKeyMap.hpp:4
constexpr auto toUnorderedSet(R &&range)
Definition CollectionConcepts.hpp:73
constexpr size_t size(std::ranges::range auto &&range) noexcept
Definition CollectionConcepts.hpp:50
constexpr auto toVector(R &&range)
Definition CollectionConcepts.hpp:64
constexpr bool isEmpty(std::ranges::range auto &&range) noexcept
Definition CollectionConcepts.hpp:59