Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
ObjectConcepts.hpp
Go to the documentation of this file.
1#pragma once
2#include <ostream>
3#include <concepts>
4
5namespace fishnet::util {
11template<typename T>
12concept HasToString = requires(const T &obj){
13 { obj.toString() } -> std::convertible_to<std::string>;
14};
15
21template<typename T>
22concept HasHashMethod = requires(const std::remove_cvref_t<T> & obj){
23 {obj.hash()} -> std::convertible_to<std::size_t>;
24};
25
31template<typename Key>
32concept Hashable = HasHashMethod<Key> || requires(Key key)
33{
34 { std::hash<std::remove_cvref_t<Key>>{}(key) } -> std::convertible_to<std::size_t>;
35};
36
42template<typename T>
43concept Mapable = Hashable<T> && std::equality_comparable<T>;
44
50template<typename T>
51concept Object = HasToString<T> && Hashable<T> && std::equality_comparable<T>;
52
53} // fishnet::util
54
55namespace std{
56 template<fishnet::util::HasHashMethod T>
57 struct hash<T>{
58 size_t operator()(const fishnet::util::HasHashMethod auto & obj) const {
59 return obj.hash();
60 }
61 };
62}
63
64constexpr std::ostream & operator << (std::ostream & os,fishnet::util::HasToString auto const & obj) noexcept{
65 os << obj.toString();
66 return os;
67}
constexpr std::ostream & operator<<(std::ostream &os, fishnet::util::HasToString auto const &obj) noexcept
Definition ObjectConcepts.hpp:64
Helper concept which checks whether a class has a hash method.
Definition ObjectConcepts.hpp:22
Helper concept which checks whether a class has a toString method.
Definition ObjectConcepts.hpp:12
Helper concept which checks whether a class is hashable, either by having a hash method or by being c...
Definition ObjectConcepts.hpp:32
Helper concept which checks whether a class can be natively used as a key in a map,...
Definition ObjectConcepts.hpp:43
Helper concept which checks whether a class is an object, meaning it has a string representation,...
Definition ObjectConcepts.hpp:51
Definition AlternativeKeyMap.hpp:4
STL namespace.
size_t operator()(const fishnet::util::HasHashMethod auto &obj) const
Definition ObjectConcepts.hpp:58