.. _codec_output: ******************** codecs::codec_output ******************** Defined in header ```` .. code-block:: cpp #include template concept codec_output = meta::input_range && requires (R& range) { { codecs::output_traits::create(range) } -> meta::same_as; }; The **codec_output** concept specifies the requirements that a type must fulfill in order to be returned by a :ref:`codec`. It relies on the customization point :ref:`output_traits`. ---- Notation ======== * **r** - a value of type ``R&`` Template arguments ================== Definitions ----------- .. table:: :align: left ===== ============================================= **R** Input range from which ``T`` must be created. ===== ============================================= Constraints ----------- .. table:: :align: left ===== ================== **R** :ref:`input_range` ===== ================== Valid expressions ================= .. table:: :align: left =============================== =========== Expressions Return type =============================== =========== **output_traits::create(r)** ``T`` =============================== =========== Expression semantics ==================== .. table:: :align: left =============================== ================================================ Expressions Semantics =============================== ================================================ **output_traits::create(r)** Creates and returns a ``T`` from ``r`` 's input. =============================== ================================================ Concept emulation ================= .. code-block:: cpp namespace mgs { namespace codecs { template struct is_codec_output { /* ... */ }; template constexpr auto is_codec_output_v = is_codec_output::value; template >> using codec_output = T; } // namespace codecs } // namespace mgs Example ======= .. code-block:: cpp #include #include #include #include #include #include #include // add support for QLinkedList namespace mgs { namespace codecs { template struct output_traits> { template static QLinkedList create(R& range) { QLinkedList list; std::copy(range.begin(), range.end(), std::back_inserter(list)); return list; } }; } // namespace codecs } // namespace mgs using namespace mgs; using namespace mgs::codecs; int main() { using encoder = base64::encoder>; static_assert(is_codec_output_v, ""); static_assert(is_codec_output_v, encoder>, ""); static_assert(!is_codec_output_v, encoder>, ""); }