codecs::codec_output¶
Defined in header <mgs/codecs/concepts/codec_output.hpp>
#include <mgs/codecs/output_traits_fwd.hpp>
template <typename T, typename R>
concept codec_output =
meta::input_range<R> &&
requires (R& range) {
{ codecs::output_traits<T>::create(range) } -> meta::same_as<T>;
};
The codec_output concept specifies the requirements that a type must fulfill in order to be returned by a codecs::codec.
It relies on the customization point codecs::output_traits.
Notation¶
r - a value of type
R&
Valid expressions¶
Expressions |
Return type |
---|---|
output_traits<T>::create(r) |
|
Expression semantics¶
Expressions |
Semantics |
---|---|
output_traits<T>::create(r) |
Creates and returns a |
Concept emulation¶
namespace mgs {
namespace codecs {
template <typename T, typename R>
struct is_codec_output { /* ... */ };
template <typename T, typename R>
constexpr auto is_codec_output_v = is_codec_output<T, R>::value;
template <typename T, typename R,
typename = std::enable_if_t<is_codec_output_v<T, R>>>
using codec_output = T;
} // namespace codecs
} // namespace mgs
Example¶
#include <algorithm>
#include <mgs/codecs/output_traits_fwd.hpp>
#include <mgs/codecs/concepts/codec_output.hpp>
#include <mgs/codecs/iterator_sentinel_source.hpp>
#include <mgs/base64.hpp>
#include <QLinkedList>
#include <QList>
// add support for QLinkedList
namespace mgs {
namespace codecs {
template <typename CharT>
struct output_traits<QLinkedList<CharT>> {
template <typename R>
static QLinkedList<CharT> create(R& range) {
QLinkedList<CharT> 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<codecs::iterator_sentinel_source<char const*>>;
static_assert(is_codec_output_v<std::string, encoder>, "");
static_assert(is_codec_output_v<QLinkedList<char>, encoder>, "");
static_assert(!is_codec_output_v<QList<char>, encoder>, "");
}