Module entry:
import mcpplibs.primitives;
Top-level import:
import mcpplibs.primitives;This module exports:
mcpplibs.primitives.underlyingmcpplibs.primitives.policymcpplibs.primitives.primitivemcpplibs.primitives.operations
mcpplibs::primitives: core types, concepts, andprimitive.mcpplibs::primitives::underlying: underlying traits and categories.mcpplibs::primitives::policy: policy tags, defaults, and protocols.mcpplibs::primitives::operations: functional dispatch API.mcpplibs::primitives::operators: operator overload entry.mcpplibs::primitives::meta: primitive metadata traits.mcpplibs::primitives::types: convenience aliases for common underlying types.
underlying_type<T>boolean_underlying_type<T>character_underlying_type<T>integer_underlying_type<T>floating_underlying_type<T>numeric_underlying_type<T>has_common_rep<LhsRep, RhsRep>common_rep_t<LhsRep, RhsRep>
policy::policy_type<P>policy::value_policy<P>policy::type_policy<P>policy::error_policy<P>policy::concurrency_policy<P>policy::resolve_policy_t<category, Policies...>
meta::traits<primitive<...>>
exposesvalue_type / policies / value_policy / type_policy / error_policy / concurrency_policymeta::make_primitive_t<T, PoliciesTuple>
template <underlying_type T, policy::policy_type... Policies>
class primitive;value_type = Tpolicies = std::tuple<Policies...>
explicit primitive(T): same-underlying construction.explicit primitive(U): cross-underlying construction (subject to type policy).- Copy/move construction and assignment are supported for the same policy set.
- Cross-underlying primitive construction/assignment is supported when allowed by type policy.
value()/value() constexplicit operator value_type() constload() -> value_typestore(desired)compare_exchange(expected, desired) -> bool
Notes:
store/compare_exchangealways support same-underlying types.- Cross-underlying
store/compare_exchangeare available only when type policy allows. - Access APIs are provided by
policy::concurrency::handler<..., void, ...>.
policy::type::strict: only identical types are allowed.policy::type::compatible: requires same underlying category and a validcommon_rep.policy::type::transparent: only requires a validcommon_rep.
- Integers:
U8/U16/U32/U64,I8/I16/I32/I64 - Floating-point:
F32/F64/F80 - Bool/chars:
Bool/UChar/Char8/Char16/Char32/WChar
Example:
using value_t = mcpplibs::primitives::types::I32<
mcpplibs::primitives::policy::value::checked,
mcpplibs::primitives::policy::error::expected>;The operations namespace provides function-style APIs with unified std::expected results.
primitive_dispatch_result_t<OpTag, Lhs, Rhs, ErrorPayload>mixed_primitive_dispatch_result_t<OpTag, Primitive, Underlying, ErrorPayload>three_way_dispatch_result_t<Lhs, Rhs, ErrorPayload>
incrementdecrementbit_notunary_plusunary_minus
addsubmuldivmod
shift_leftshift_rightbit_andbit_orbit_xor
equalnot_equalthree_way_compare
add_assign/sub_assign/mul_assign/div_assign/mod_assignshift_left_assign/shift_right_assignbit_and_assign/bit_or_assign/bit_xor_assign
Most binary operations support:
primitive op primitiveprimitive op underlyingunderlying op primitive
To use + - * / % ... syntax, import:
using namespace mcpplibs::primitives::operators;Operator results are still std::expected<...>, not raw values.
- Value:
policy::value::{checked, unchecked, saturating} - Type:
policy::type::{strict, compatible, transparent} - Error:
policy::error::{throwing, expected, terminate} - Concurrency:
policy::concurrency::{none, fenced, fenced_relaxed, fenced_acq_rel, fenced_seq_cst}
policy::defaults::value = policy::value::checkedpolicy::defaults::type = policy::type::strictpolicy::defaults::error = policy::error::throwingpolicy::defaults::concurrency = policy::concurrency::none
policy::error::kind:
noneinvalid_type_combinationoverflowunderflowdivide_by_zerodomain_errorunspecified
Required members:
value_typerep_typeenabledkindto_rep(value)from_rep(rep)is_valid_rep(rep)
Specialize underlying::common_rep_traits<LhsRep, RhsRep> to override the default std::common_type_t behavior.
- Most operations/operators APIs return
std::expected<...>. - With
policy::error::expected, failures are returned asunexpected(policy::error::kind). - With
policy::error::throwing, runtime failures throw exceptions (while API signatures still usestd::expected).
import std;
import mcpplibs.primitives;
using namespace mcpplibs::primitives;
using namespace mcpplibs::primitives::operators;
int main() {
using value_t =
primitive<int, policy::value::checked, policy::error::expected>;
auto const out = value_t{40} + value_t{2};
if (!out.has_value()) {
return 1;
}
return out->value() == 42 ? 0 : 1;
}