Loading...
Searching...
No Matches
inout_linearizer.h
Go to the documentation of this file.
1#ifndef _BBM_INOUT_LINEARIZER_CONCEPT_H_
2#define _BBM_INOUT_LINEARIZER_CONCEPT_H_
3
4#include "bbm/config.h"
5
6/************************************************************************/
7/*! \file inout_linearizer.h
8
9 \brief inout_linearizer contract
10*************************************************************************/
11
12namespace bbm {
13 namespace concepts {
14
15 /********************************************************************/
16 /*! \brief inout_linearizer concept
17
18 An inout_linearizer enumerates a discrete set of (in,out) directions
19 on the joint incident and outgoing direction sphere.
20
21 Each inout_linearizer contains the following:
22 + concept::has_config
23 + Size_t size(void) const: the number of discrete direction-pairs
24 + Vec3dPair opeator()(Size_t index, Mask mask=true) const: returns the index-th direction pair
25 + Size_t operator()(const Vec3d& in, const Vec3d& out, Mask mask=true) const: the inverse operation
26 *********************************************************************/
27 template<typename T>
28 concept inout_linearizer = requires(const T& t)
29 {
31 { t.size() } -> std::same_as<Size_t<T>>;
32
33 { t.operator()(std::declval<Size_t<T>>(), std::declval<Mask_t<T>>()) } -> std::same_as<Vec3dPair_t<T>>;
34 { t.operator()(std::declval<Size_t<T>>()) } -> std::same_as<Vec3dPair_t<T>>;
35
36 { t.operator()(std::declval<Vec3d_t<T>>(), std::declval<Vec3d_t<T>>(), std::declval<Mask_t<T>>()) } -> std::same_as<Size_t<T>>;
37 { t.operator()(std::declval<Vec3d_t<T>>(), std::declval<Vec3d_t<T>>()) } -> std::same_as<Size_t<T>>;
38 };
39
40 /********************************************************************/
41 /*! \brioef inout_linearizer archetype for concept checking
42
43 \tparam CONF = config to check for. Default = archetype::config
44 *********************************************************************/
45 namespace archetype {
46 template<typename CONF=config> requires concepts::config<CONF>
48 {
49 using Config = CONF;
50 Size_t<Config> size(void) const;
51 Vec3dPair_t<Config> operator()(const Size_t<Config>&, Mask_t<Config> = true) const;
52 Size_t<Config> operator()(const Vec3d_t<Config>&, const Vec3d_t<Config>&, Mask_t<Config> = true) const;
53 };
54 } // end archetype namespace
55
57
58 } // end concepts namespace
59} // end bbm namespace
60
61#endif /* _BBM_INOUT_LINEARIZER_CONCEPT_H_ */
All BBM methods are defined to operate on a variety of value types and spectrum types....
config concept
Definition: config.h:31
has_config
Definition: config.h:53
inout_linearizer concept
Definition: inout_linearizer.h:28
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
Definition: aggregatebsdf.h:29
Definition: inout_linearizer.h:48
Size_t< Config > size(void) const
Size_t< Config > operator()(const Vec3d_t< Config > &, const Vec3d_t< Config > &, Mask_t< Config >=true) const
Vec3dPair_t< Config > operator()(const Size_t< Config > &, Mask_t< Config >=true) const
CONF Config
Definition: inout_linearizer.h:49