23 #ifndef LELY_CO_VAL_HPP_
24 #define LELY_CO_VAL_HPP_
26 #if !defined(__cplusplus) || LELY_NO_CXX
27 #error "include <lely/co/val.h> for the C interface"
41 template <co_
unsigned16_t N>
46 static const co_unsigned16_t index = traits::index;
48 typedef typename traits::type type;
50 operator const type&()
const noexcept {
return m_val; }
51 operator type&() noexcept {
return m_val; }
57 COVal(
const type& val) : m_val(val) {}
58 COVal(type&& val) : m_val(::std::move(val)) {}
60 COVal(
const void* ptr, ::std::size_t n) {
69 operator=(
const type& val) {
75 operator=(type&& val) {
76 m_val = ::std::move(val);
81 address()
const noexcept {
82 return static_cast<const void*
>(&m_val);
86 size()
const noexcept {
100 static const co_unsigned16_t index = traits::index;
102 typedef typename traits::type type;
104 operator type()
const noexcept {
return m_val; }
106 operator ::std::string()
const {
107 return m_val ? ::std::string(m_val) : ::std::string();
111 COVal(
const COVal& val) : m_val() { *
this = val; }
112 COVal(
COVal&& val) : m_val() { *
this = ::std::move(val); }
114 COVal(
const void* ptr, ::std::size_t n) {
119 COVal(
const char* vs) { init(vs); }
120 COVal(const ::std::string& vs) { init(vs); }
125 operator=(
const COVal& val) {
134 operator=(
COVal&& val) {
141 operator=(
const char* vs) {
148 operator=(const ::std::string& vs) {
155 address()
const noexcept {
160 size()
const noexcept {
166 init(
const char* vs) {
171 init(const ::std::string& vs) {
184 static const co_unsigned16_t index = traits::index;
186 typedef typename traits::type type;
188 operator type()
const noexcept {
return m_val; }
190 operator ::std::vector<uint_least8_t>()
const {
191 return m_val ? ::std::vector<uint_least8_t>(m_val, m_val + size())
192 : ::std::vector<uint_least8_t>();
196 COVal(
const COVal& val) : m_val() { *
this = val; }
197 COVal(
COVal&& val) : m_val() { *
this = ::std::move(val); }
199 COVal(
const void* ptr, ::std::size_t n) {
204 COVal(
const uint_least8_t* os, ::std::size_t n) { init(os, n); }
205 COVal(const ::std::vector<uint_least8_t>& os) { init(os); }
210 operator=(
const COVal& val) {
219 operator=(
COVal&& val) {
226 operator=(const ::std::vector<uint_least8_t>& os) {
233 address()
const noexcept {
238 size()
const noexcept {
244 init(
const uint_least8_t* os, ::std::size_t n) {
249 init(const ::std::vector<uint_least8_t>& os) {
250 init(os.data(), os.size());
262 static const co_unsigned16_t index = traits::index;
264 typedef typename traits::type type;
266 operator type()
const noexcept {
return m_val; }
268 operator ::std::basic_string<char16_t>()
const {
269 return m_val ? ::std::basic_string<char16_t>(m_val)
270 : ::std::basic_string<char16_t>();
274 COVal(
const COVal& val) : m_val() { *
this = val; }
275 COVal(
COVal&& val) : m_val() { *
this = ::std::move(val); }
277 COVal(
const void* ptr, ::std::size_t n) {
282 COVal(
const char16_t* us) { init(us); }
283 COVal(const ::std::basic_string<char16_t>& us) { init(us); }
288 operator=(
const COVal& val) {
297 operator=(
COVal&& val) {
304 operator=(
const char16_t* us) {
311 operator=(const ::std::basic_string<char16_t>& us) {
318 address()
const noexcept {
323 size()
const noexcept {
329 init(
const char16_t* us) {
334 init(const ::std::basic_string<char16_t>& us) {
347 static const co_unsigned16_t index = traits::index;
349 typedef typename traits::type type;
351 operator type()
const noexcept {
return m_val; }
354 COVal(
const COVal& val) : m_val() { *
this = val; }
355 COVal(
COVal&& val) : m_val() { *
this = ::std::move(val); }
357 COVal(
const void* dom, ::std::size_t n) {
364 operator=(
const COVal& val) {
373 operator=(
COVal&& val) {
380 address()
const noexcept {
385 size()
const noexcept {
395 #endif // !LELY_CO_VAL_HPP_