123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE section PUBLIC "-//Boost//DTD BoostBook XML V1.1//EN"
- "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
- <section id="safe_numerics.safe_literal">
- <title>safe_signed_literal<Value, PP , EP> and
- safe_unsigned_literal<Value, PP, EP></title>
- <?dbhtml stop-chunking?>
- <section>
- <title>Description</title>
- <para>A safe type which holds a literal value. This is required to be able
- to initialize other safe types in such a way that an exception code is not
- generated. It is also useful when creating constexpr versions of safe
- types. It contains one immutable value known at compile time and hence can
- be used in any constexpr expression.</para>
- </section>
- <section>
- <title>Model of</title>
- <para><link linkend="safe_numerics.numeric">Integer</link></para>
- <para><link
- linkend="safe_numerics.safe_numeric_concept">SafeNumeric</link></para>
- <para>This type inherits all the notation, associated types and template
- parameters and valid expressions of <link
- linkend="safe_numerics.safe_numeric_concept">SafeNumeric</link> types. The
- following specify additional features of this type.</para>
- </section>
- <section>
- <title>Associated Types</title>
- <informaltable>
- <tgroup cols="2">
- <colspec align="left" colwidth="1*"/>
- <colspec align="left" colwidth="10*"/>
- <tbody>
- <row>
- <entry><code>PP</code></entry>
- <entry>A type which specifies the result type of an expression
- using safe types.</entry>
- </row>
- <row>
- <entry><code>EP</code></entry>
- <entry>A type containing members which are called when a correct
- result cannot be returned</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
- <section>
- <title>Template Parameters</title>
- <informaltable>
- <tgroup cols="3">
- <colspec align="left" colwidth="1*"/>
- <colspec align="left" colwidth="1*"/>
- <colspec align="left" colwidth="3*"/>
- <thead>
- <row>
- <entry align="left">Parameter</entry>
- <entry align="left">Type Requirements</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><code>Value</code></entry>
- <entry><code><link
- linkend="safe_numerics.numeric">Integer</link></code></entry>
- <entry>value used to initialize the literal</entry>
- </row>
- <row>
- <entry><code>PP</code></entry>
- <entry><link linkend="safe_numerics.numeric"><link
- linkend="safe_numerics.promotion_policy">PromotionPolicy<PP></link></link></entry>
- <entry><para>Optional promotion policy. Default value is
- <code>void</code></para></entry>
- </row>
- <row>
- <entry><code>EP</code></entry>
- <entry><link linkend="safe_numerics.numeric"><link
- linkend="safe_numerics.exception_policy">Exception
- Policy<EP></link></link></entry>
- <entry><para>Optional exception policy. Default value is
- <code>void</code></para></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </section>
- <section>
- <title>Inherited Valid Expressions</title>
- <para>safe literal types are immutable. Hence they only inherit those
- valid expressions which don't change the value. <emphasis>This excludes
- assignment, increment, and decrement and all unary operators except unary
- -, + and ~</emphasis>. Other than that, they can be used anywhere a <link
- linkend="safe_numerics.safe_numeric_concept">SafeNumeric</link> type can
- be used. Note that the default promotion and exception policies are void.
- This is usually convenient since when a safe literal is used in a binary
- operation, this will inherit the policies of the other type. On the other
- hand, this can be inconvenient when operands of a binary expression are
- both safe literals. This will fail to compile since there are no
- designated promotion and exception policies. The way to address this to
- assign specific policies as in this example.</para>
- <para><programlisting>template<typename T>
- using compile_time_value = safe_signed_literal<T>;
- constexpr compile_time_value<1000> x;
- constexpr compile_time_value<0> y;
- // should compile and execute without problem
-
- std::cout << x << '\n';
- // all the following statements should fail to compile because there are
- // no promotion and exception policies specified.
- constexpr safe<int> z = x / y;
- </programlisting></para>
- </section>
- <section>
- <title>Example of use</title>
- <programlisting>#include <boost/numeric/safe_numerics/safe_integer_literal.hpp>
- constexpr boost::numeric::safe_signed_literal<42> x;
- </programlisting>
- </section>
- <section id="safe_numerics.safe_literal.make_safe_literal">
- <title><code>make_safe_literal(n, PP, EP) </code></title>
- <para>This is a macro which returns an instance of a safe literal type.
- This instance will hold the value n. The type of the value returned will
- be the smallest safe type which can hold the value <code>n</code>.</para>
- </section>
- <section>
- <title>Header</title>
- <para><ulink
- url="../../include/boost/safe_numerics/safe_integer_literal.hpp">#include
- <boost/numeric/safe_numerics/safe_integer_literal.hpp></ulink></para>
- </section>
- </section>
|