The Searchable concept represents structures that can be searched.
Intuitively, a Searchable is any structure, finite or infinite, containing elements that can be searched using a predicate. Sometimes, Searchables will associate keys to values; one can search for a key with a predicate, and the value associated to it is returned. This gives rise to map-like data structures. Other times, the elements of the structure that are searched (i.e. those to which the predicate is applied) are the same that are returned, which gives rise to set-like data structures. In general, we will refer to the keys of a Searchable structure as those elements that are used for searching, and to the values of a Searchable as those elements that are returned when a search is successful. As was explained, there is no requirement that both notions differ, and it is often useful to have keys and values coincide (think about std::set).
Some methods like any_of, all_of and none_of allow simple queries to be performed on the keys of the structure, while other methods like find and find_if make it possible to find the value associated to a key. The most specific method should always be used if one cares about performance, because it is usually the case that heavy optimizations can be performed in more specific methods. For example, an associative data structure implemented as a hash table will be much faster to access using find than find_if, because in the second case it will have to do a linear search through all the entries. Similarly, using contains will likely be much faster than any_of with an equivalent predicate.
Insight
In a lazy evaluation context, anyFoldablecan also become a model ofSearchablebecause we can search lazily through the structure withfold_right. However, in the context of C++, someSearchables can not be folded; think for example of an infinite set.
find_if and any_of
When find_if and any_of are provided, the other functions are implemented according to the laws explained below.
any_of(xs, pred) by checking whether find_if(xs, pred) is an empty optional or not, and then reduce the minimal complete definition to find_if. However, this is not done because that implementation requires the predicate of any_of to return a compile-time Logical, which is more restrictive than what we have right now.In order for the semantics of the methods to be consistent, some properties must be satisfied by any model of the Searchable concept. Rigorously, for any Searchables xs and ys and any predicate p, the following laws should be satisfied:
Additionally, if all the keys of the Searchable are Logicals, the following laws should be satisfied:
hana::map, hana::optional, hana::range, hana::set, hana::string, hana::tuple
Builtin arrays whose size is known can be searched as-if they were homogeneous tuples. However, since arrays can only hold objects of a single type and the predicate to find_if must return a compile-time Logical, the find_if method is fairly useless. For similar reasons, the find method is also fairly useless. This model is provided mainly because of the any_of method & friends, which are both useful and compile-time efficient.
Given two Searchables S1 and S2, a function \( f : S_1(X) \to S_2(X) \) is said to preserve the Searchable structure if for all xs of data type S1(X) and predicates \( \mathtt{pred} : X \to Bool \) (for a Logical Bool),
This is really just a generalization of the following, more intuitive requirements. For all xs of data type S1(X) and x of data type X,
These requirements can be understood as saying that f does not change the content of xs, although it may reorder elements. As usual, such a structure-preserving transformation is said to be an embedding if it is also injective, i.e. if it is a lossless transformation.
Variables | |
| constexpr auto | boost::hana::all |
| Returns whether all the keys of the structure are true-valued. More... | |
| constexpr auto | boost::hana::all_of |
Returns whether all the keys of the structure satisfy the predicate. More... | |
| constexpr auto | boost::hana::any |
| Returns whether any key of the structure is true-valued. More... | |
| constexpr auto | boost::hana::any_of |
Returns whether any key of the structure satisfies the predicate. More... | |
| constexpr auto | boost::hana::at_key |
| Returns the value associated to the given key in a structure, or fail. More... | |
| constexpr auto | boost::hana::contains |
| Returns whether the key occurs in the structure. More... | |
| constexpr auto | boost::hana::in = hana::infix(hana::flip(hana::contains)) |
| Return whether the key occurs in the structure. More... | |
| constexpr auto | boost::hana::find |
| Finds the value associated to the given key in a structure. More... | |
| constexpr auto | boost::hana::find_if |
| Finds the value associated to the first key satisfying a predicate. More... | |
| constexpr auto | boost::hana::is_disjoint |
Returns whether two Searchables are disjoint. More... | |
| constexpr auto | boost::hana::is_subset |
| Returns whether a structure contains a subset of the keys of another structure. More... | |
| constexpr auto | boost::hana::none |
| Returns whether all of the keys of the structure are false-valued. More... | |
| constexpr auto | boost::hana::none_of |
Returns whether none of the keys of the structure satisfy the predicate. More... | |
|
constexpr |
#include <boost/hana/fwd/all.hpp>
Returns whether all the keys of the structure are true-valued.
The keys of the structure must be Logicals. If the structure is not finite, a false-valued key must appear at a finite "index" in order for this method to finish.
|
constexpr |
#include <boost/hana/fwd/all_of.hpp>
Returns whether all the keys of the structure satisfy the predicate.
If the structure is not finite, predicate has to return a false- valued Logical after looking at a finite number of keys for this method to finish.
| xs | The structure to search. |
| predicate | A function called as predicate(k), where k is a key of the structure, and returning a Logical. |
|
constexpr |
#include <boost/hana/fwd/any.hpp>
Returns whether any key of the structure is true-valued.
The keys of the structure must be Logicals. If the structure is not finite, a true-valued key must appear at a finite "index" in order for this method to finish.
|
constexpr |
#include <boost/hana/fwd/any_of.hpp>
Returns whether any key of the structure satisfies the predicate.
If the structure is not finite, predicate has to be satisfied after looking at a finite number of keys for this method to finish.
| xs | The structure to search. |
| predicate | A function called as predicate(k), where k is a key of the structure, and returning a Logical. |
|
constexpr |
#include <boost/hana/fwd/at_key.hpp>
Returns the value associated to the given key in a structure, or fail.
Given a key and a Searchable structure, at_key returns the first value whose key is equal to the given key, and fails at compile-time if no such key exists. This requires the key to be compile-time Comparable, exactly like for find. at_key satisfies the following:
If the Searchable actually stores the elements it contains, at_key is required to return a lvalue reference, a lvalue reference to const or a rvalue reference to the found value, where the type of reference must match that of the structure passed to at_key. If the Searchable does not store the elements it contains (i.e. it generates them on demand), this requirement is dropped.
| xs | The structure to be searched. |
| key | A key to be searched for in the structure. The key has to be Comparable with the other keys of the structure. In the current version of the library, the comparison of key with any other key of the structure must return a compile-time Logical. |
|
constexpr |
#include <boost/hana/fwd/contains.hpp>
Returns whether the key occurs in the structure.
Given a Searchable structure xs and a key, contains returns whether any of the keys of the structure is equal to the given key. If the structure is not finite, an equal key has to appear at a finite position in the structure for this method to finish. For convenience, contains can also be applied in infix notation.
| xs | The structure to search. |
| key | A key to be searched for in the structure. The key has to be Comparable with the other keys of the structure. |
|
constexpr |
#include <boost/hana/fwd/contains.hpp>
Return whether the key occurs in the structure.
Specifically, this is equivalent to contains, except in takes its arguments in reverse order. Like contains, in can also be applied in infix notation for increased expressiveness. This function is not a method that can be overriden; it is just a convenience function provided with the concept.
|
constexpr |
#include <boost/hana/fwd/find.hpp>
Finds the value associated to the given key in a structure.
Given a key and a Searchable structure, find returns the just the first value whose key is equal to the given key, or nothing if there is no such key. Comparison is done with equal. find satisfies the following:
| xs | The structure to be searched. |
| key | A key to be searched for in the structure. The key has to be Comparable with the other keys of the structure. In the current version of the library, the comparison of key with any other key of the structure must return a compile-time Logical. |
|
constexpr |
#include <boost/hana/fwd/find_if.hpp>
Finds the value associated to the first key satisfying a predicate.
Given a Searchable structure xs and a predicate pred, find_if(xs, pred) returns just the first element whose key satisfies the predicate, or nothing if there is no such element.
| xs | The structure to be searched. |
| predicate | A function called as predicate(k), where k is a key of the structure, and returning whether k is the key of the element being searched for. In the current version of the library, the predicate has to return an IntegralConstant holding a value that can be converted to bool. |
|
constexpr |
#include <boost/hana/fwd/is_disjoint.hpp>
Returns whether two Searchables are disjoint.
Given two Searchables xs and ys, is_disjoint returns a Logical representing whether the keys in xs are disjoint from the keys in ys, i.e. whether both structures have no keys in common.
| xs,ys | Two Searchables to test for disjointness. |
|
constexpr |
#include <boost/hana/fwd/is_subset.hpp>
Returns whether a structure contains a subset of the keys of another structure.
Given two Searchables xs and ys, is_subset returns a Logical representing whether xs is a subset of ys. In other words, it returns whether all the keys of xs are also present in ys. This method does not return whether xs is a strict subset of ys; if xs and ys are equal, all the keys of xs are also present in ys, and is_subset returns true.
is_subset can also be applied in infix notation.This method is tag-dispatched using the tags of both arguments. It can be called with any two Searchables sharing a common Searchable embedding, as defined in the main documentation of the Searchable concept. When Searchables with two different tags but sharing a common embedding are sent to is_subset, they are first converted to this common Searchable and the is_subset method of the common embedding is then used. Of course, the method can be overriden for custom Searchables for efficieny.
is_subset is supported, it is not currently used by the library because there are no models of Searchable with a common embedding.| xs | The structure to check whether it is a subset of ys. |
| ys | The structure to check whether it is a superset of xs. |
|
constexpr |
#include <boost/hana/fwd/none.hpp>
Returns whether all of the keys of the structure are false-valued.
The keys of the structure must be Logicals. If the structure is not finite, a true-valued key must appear at a finite "index" in order for this method to finish.
|
constexpr |
#include <boost/hana/fwd/none_of.hpp>
Returns whether none of the keys of the structure satisfy the predicate.
If the structure is not finite, predicate has to return a true- valued Logical after looking at a finite number of keys for this method to finish.
| xs | The structure to search. |
| predicate | A function called as predicate(k), where k is a key of the structure, and returning a Logical. |