Domain concepts (details)

Table of Contents

Domain

template<typename D>
concept Domain
  1. Refines the template <typename T> Regular concept.
  2. Dom::point_type models template <typename Pnt> Point concept.
  3. Dom::const_point_range models the template <typename BidirRng> BidirectionalRange concept
  4. Dom::codomain_type models template <typename Val> Value concept, is non-const and is not a reference.
  5. Dom provides methods has, shape, empty, is_continuous, is_discrete and points.

Notation

type Dom
using point_type = Dom::point_type
using const_point_range = Dom::const_point_range
Dom dom
Dom dom_cpy
const Dom cdom
const Dom lhs
const Dom rhs
point_type p

Valid Expressions

  • dom() returns an instance of Dom.
  • cdom() returns an instance of const Dom.
  • dom_cpy(dom) returns an instance of Dom.
  • dom_cpy(cdom) returns an instance of Dom.
  • dom_cpy(move(dom)) returns an instance of Dom.
  • dom_cpy = dom returns an instance of Dom&.
  • dom_cpy = cdom returns an instance of Dom&.
  • dom_cpy = move(dom) returns an instance of Dom&.
  • lhs == rhs return-type models template <typename B> Boolean.
  • lhs != rhs return-type models template <typename B> Boolean.
  • rhs == lhs return-type models template <typename B> Boolean.
  • rhs != lhs return-type models template <typename B> Boolean.
  • cdom.has(p) return-type models template <typename B> Boolean.
  • cdom.empty() return-type models template <typename B> Boolean.
  • cdom.is_continuous() return-type models template <typename B> Boolean.
  • cdom.is_discrete() return-type models template <typename B> Boolean.
  • cdom.points() returns const_point_range.

Possible implementation

template<typename D, Dom = remove_cvref<D>>
concept Domain =    Regular<Dom> &&

                    requires {
                        typename Dom::point_type;
                        typename Dom::const_point_range;
                        typename Dom::codomain_type;
                    } &&

                    Point<Dom::point_type> &&
                    BidirectionalRange<Dom::const_point_range> &&
                    Value<Dom::codomain_type> &&

                    Same<const Dom::point_type, Dom::const_point_range::value_type> &&

                    !is_const_v<Dom::codomain_type> &&
                    !is_reference_v<Dom::codomain_type> &&

                    requires(const Dom cdom, Dom::point_type p) {
                        { cdom.has(p) }             -> bool;
                        { cdom.empty() }            -> bool;
                        { cdom.is_continuous() }    -> bool;
                        { cdom.is_discrete() }      -> bool;
                        { cdom.points() }           -> Dom::const_point_range;
                    };