26#ifndef WAYLAND_UTIL_HPP
27#define WAYLAND_UTIL_HPP
38#include <wayland-client-core.h>
40#define wl_array_for_each_cpp(pos, array) \
41 for((pos) = static_cast<decltype(pos)>((array)->data); \
42 reinterpret_cast<const char*>(pos) < (reinterpret_cast<const char*>((array)->data) + (array)->size); \
66 int check_return_value(
int return_value, std::string
const &function_name);
73 template<
typename native_t>
77 native_t *
object =
nullptr;
96 *
this = std::move(other);
99 native_t *c_ptr()
const
102 throw std::runtime_error(
"Tried to access empty object");
106 bool has_object()
const
111 operator bool()
const
116 operator native_t*()
const
126 object = right.object;
132 std::swap(
object, right.object);
138 return object == right.object;
143 return !(*
this == right);
152 template<
typename native_t>
156 std::shared_ptr<native_t> object;
160 :
object{std::move(
object)}
164 std::shared_ptr<native_t> ref_ptr()
const
180 *
this = std::move(other);
183 native_t *c_ptr()
const
186 throw std::runtime_error(
"Tried to access empty object");
190 bool has_object()
const
195 operator bool()
const
200 operator native_t*()
const
210 object = right.object;
216 std::swap(
object, right.object);
222 return object == right.object;
227 return !(*
this == right);
238 base(
const base&) =
default;
239 base(base&&) noexcept = default;
240 base& operator=(const base&) = default;
241 base& operator=(base&&) noexcept = default;
242 virtual ~base() noexcept = default;
243 virtual const std::type_info &type_info() const = 0;
244 virtual base *clone() const = 0;
247 template <typename T>
248 class derived : public base
256 : val(std::move(t)) { }
258 const std::type_info &type_info()
const override
263 base *clone()
const override
265 return new derived<T>(val);
275 : val(a.val ? a.val->clone() : nullptr) { }
277 any(any &&a)
noexcept
279 operator=(std::move(a));
282 template <
typename T>
284 : val(new derived<T>(t)) { }
291 any &operator=(
const any &a)
296 val = a.val ? a.val->clone() :
nullptr;
301 any &operator=(any &&a)
noexcept
303 std::swap(val, a.val);
307 template <
typename T>
308 any &operator=(
const T &t)
310 if(val &&
typeid(T) == val->type_info())
311 static_cast<derived<T>*
>(val)->val = t;
315 val =
new derived<T>(t);
320 template <
typename T>
323 if(val &&
typeid(T) == val->type_info())
324 return static_cast<derived<T>*
>(val)->val;
325 throw std::bad_cast();
328 template <
typename T>
331 if(val &&
typeid(T) == val->type_info())
332 return static_cast<derived<T>*
>(val)->val;
333 throw std::bad_cast();
337 template<
unsigned int size,
int id = 0>
341 static const uint32_t mask = (1 << size) - 1;
344 explicit bitfield(
const uint32_t value = 0)
349 explicit operator uint32_t()
const
354 operator bool()
const
359 bitfield(
const bitfield<size, id> &b)
364 bitfield(bitfield<size, id>&&) noexcept = default;
366 ~bitfield() noexcept = default;
368 bool operator==(const bitfield<size,
id> &b)
373 bool operator!=(
const bitfield<size, id> &b)
375 return !operator==(b);
378 bitfield<size, id> &operator=(
const bitfield<size, id> &b)
382 v =
static_cast<uint32_t
>(b);
386 bitfield<size, id> &operator=(bitfield<size, id> &&) noexcept = default;
388 bitfield<size,
id> operator|(const bitfield<size,
id> &b)
const
390 return bitfield<size, id>(v |
static_cast<uint32_t
>(b));
393 bitfield<size, id> operator&(
const bitfield<size, id> &b)
const
395 return bitfield<size, id>(v &
static_cast<uint32_t
>(b));
398 bitfield<size, id> operator^(
const bitfield<size, id> &b)
const
400 return bitfield<size, id>((v ^
static_cast<uint32_t
>(b)) & mask);
403 bitfield<size, id> operator~()
const
405 return bitfield<size, id>(~v & mask);
408 bitfield<size, id> &operator|=(
const bitfield<size, id> &b)
410 operator=(*
this | b);
414 bitfield<size, id> &operator&=(
const bitfield<size, id> &b)
416 operator=(*
this & b);
420 bitfield<size, id> &operator^=(
const bitfield<size, id> &b)
422 operator=(*
this ^ b);
430 wl_argument argument = { .i = 0 };
431 bool is_array{
false};
434 argument_t() =
default;
437 argument_t(
const argument_t &arg);
438 argument_t(argument_t &&) noexcept = default;
439 argument_t &operator=(const argument_t &arg);
440 argument_t &operator=(argument_t&&) noexcept = default;
441 ~argument_t() noexcept;
444 argument_t(uint32_t i);
445 argument_t(int32_t i);
448 argument_t(
double f);
451 argument_t(const std::
string &s);
454 argument_t(wl_object *o);
457 argument_t(const array_t& a);
460 argument_t(std::nullptr_t);
463 static argument_t fd(
int fileno);
468 wl_argument get_c_argument() const;
475 wl_array a = { 0, 0,
nullptr };
477 array_t(wl_array *arr);
478 void get(wl_array *arr)
const;
480 friend class proxy_t;
481 friend class detail::argument_t;
482 friend class server::resource_t;
486 array_t(
const array_t &arr);
487 array_t(array_t &&arr)
noexcept;
489 template <
typename T> array_t(
const std::vector<T> &v)
492 wl_array_add(&a, v.size()*
sizeof(T));
495 wl_array_for_each_cpp(p, &a)
500 array_t &operator=(
const array_t &arr);
501 array_t &operator=(array_t &&arr)
noexcept;
503 template <
typename T> array_t &operator=(
const std::vector<T> &v)
505 wl_array_release(&a);
507 wl_array_add(&a, v.size()*
sizeof(T));
510 wl_array_for_each_cpp(p, &a)
515 template <
typename T>
operator std::vector<T>()
const
519 wl_array_for_each_cpp(p, &a)
Non-refcounted wrapper for C objects.
Refcounted wrapper for C objects.