26#ifndef WAYLAND_UTIL_HPP
27#define WAYLAND_UTIL_HPP
37#include <wayland-client-core.h>
39#define wl_array_for_each_cpp(pos, array) \
40 for((pos) = static_cast<decltype(pos)>((array)->data); \
41 reinterpret_cast<const char*>(pos) < (reinterpret_cast<const char*>((array)->data) + (array)->size); \
65 int check_return_value(
int return_value, std::string
const &function_name);
72 template<
typename native_t>
76 native_t *
object =
nullptr;
95 *
this = std::move(other);
98 native_t *c_ptr()
const
101 throw std::runtime_error(
"Tried to access empty object");
105 bool has_object()
const
110 operator bool()
const
115 operator native_t*()
const
125 object = right.object;
131 std::swap(
object, right.object);
137 return object == right.object;
142 return !(*
this == right);
151 template<
typename native_t>
155 std::shared_ptr<native_t> object;
159 :
object{std::move(
object)}
163 std::shared_ptr<native_t> ref_ptr()
const
179 *
this = std::move(other);
182 native_t *c_ptr()
const
185 throw std::runtime_error(
"Tried to access empty object");
189 bool has_object()
const
194 operator bool()
const
199 operator native_t*()
const
209 object = right.object;
215 std::swap(
object, right.object);
221 return object == right.object;
226 return !(*
this == right);
237 base(
const base&) =
default;
238 base(base&&) noexcept = default;
239 base& operator=(const base&) = default;
240 base& operator=(base&&) noexcept = default;
241 virtual ~base() noexcept = default;
242 virtual const std::type_info &type_info() const = 0;
243 virtual base *clone() const = 0;
246 template <typename T>
247 class derived : public base
255 : val(std::move(t)) { }
257 const std::type_info &type_info()
const override
262 base *clone()
const override
264 return new derived<T>(val);
274 : val(a.val ? a.val->clone() : nullptr) { }
276 any(any &&a)
noexcept
278 operator=(std::move(a));
281 template <
typename T>
283 : val(new derived<T>(t)) { }
290 any &operator=(
const any &a)
295 val = a.val ? a.val->clone() :
nullptr;
300 any &operator=(any &&a)
noexcept
302 std::swap(val, a.val);
306 template <
typename T>
307 any &operator=(
const T &t)
309 if(val &&
typeid(T) == val->type_info())
310 static_cast<derived<T>*
>(val)->val = t;
314 val =
new derived<T>(t);
319 template <
typename T>
322 if(val &&
typeid(T) == val->type_info())
323 return static_cast<derived<T>*
>(val)->val;
324 throw std::bad_cast();
327 template <
typename T>
330 if(val &&
typeid(T) == val->type_info())
331 return static_cast<derived<T>*
>(val)->val;
332 throw std::bad_cast();
336 template<
unsigned int size,
int id = 0>
340 static const uint32_t mask = (1 << size) - 1;
343 explicit bitfield(
const uint32_t value = 0)
348 explicit operator uint32_t()
const
353 operator bool()
const
358 bitfield(
const bitfield<size, id> &b)
363 bitfield(bitfield<size, id>&&) noexcept = default;
365 ~bitfield() noexcept = default;
367 bool operator==(const bitfield<size,
id> &b)
372 bool operator!=(
const bitfield<size, id> &b)
374 return !operator==(b);
377 bitfield<size, id> &operator=(
const bitfield<size, id> &b)
381 v =
static_cast<uint32_t
>(b);
385 bitfield<size, id> &operator=(bitfield<size, id> &&) noexcept = default;
387 bitfield<size,
id> operator|(const bitfield<size,
id> &b)
const
389 return bitfield<size, id>(v |
static_cast<uint32_t
>(b));
392 bitfield<size, id> operator&(
const bitfield<size, id> &b)
const
394 return bitfield<size, id>(v &
static_cast<uint32_t
>(b));
397 bitfield<size, id> operator^(
const bitfield<size, id> &b)
const
399 return bitfield<size, id>((v ^
static_cast<uint32_t
>(b)) & mask);
402 bitfield<size, id> operator~()
const
404 return bitfield<size, id>(~v & mask);
407 bitfield<size, id> &operator|=(
const bitfield<size, id> &b)
409 operator=(*
this | b);
413 bitfield<size, id> &operator&=(
const bitfield<size, id> &b)
415 operator=(*
this & b);
419 bitfield<size, id> &operator^=(
const bitfield<size, id> &b)
421 operator=(*
this ^ b);
429 wl_argument argument = { .i = 0 };
430 bool is_array{
false};
433 argument_t() =
default;
436 argument_t(
const argument_t &arg);
437 argument_t(argument_t &&) noexcept = default;
438 argument_t &operator=(const argument_t &arg);
439 argument_t &operator=(argument_t&&) noexcept = default;
440 ~argument_t() noexcept;
443 argument_t(uint32_t i);
444 argument_t(int32_t i);
447 argument_t(
double f);
450 argument_t(const std::
string &s);
453 argument_t(wl_object *o);
456 argument_t(const array_t& a);
459 argument_t(std::nullptr_t);
462 static argument_t fd(
int fileno);
467 wl_argument get_c_argument() const;
474 wl_array a = { 0, 0,
nullptr };
476 array_t(wl_array *arr);
477 void get(wl_array *arr)
const;
479 friend class proxy_t;
480 friend class detail::argument_t;
481 friend class server::resource_t;
485 array_t(
const array_t &arr);
486 array_t(array_t &&arr)
noexcept;
488 template <
typename T> array_t(
const std::vector<T> &v)
491 wl_array_add(&a, v.size()*
sizeof(T));
494 wl_array_for_each_cpp(p, &a)
499 array_t &operator=(
const array_t &arr);
500 array_t &operator=(array_t &&arr)
noexcept;
502 template <
typename T> array_t &operator=(
const std::vector<T> &v)
504 wl_array_release(&a);
506 wl_array_add(&a, v.size()*
sizeof(T));
509 wl_array_for_each_cpp(p, &a)
514 template <
typename T>
operator std::vector<T>()
const
518 wl_array_for_each_cpp(p, &a)
Non-refcounted wrapper for C objects.
Refcounted wrapper for C objects.