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); \
61 int check_return_value(
int return_value, std::string
const &function_name);
68 template<
typename native_t>
72 native_t *
object =
nullptr;
91 *
this = std::move(other);
94 native_t *c_ptr()
const
97 throw std::runtime_error(
"Tried to access empty object");
101 bool has_object()
const
106 operator bool()
const
111 operator native_t*()
const
121 object = right.object;
127 std::swap(
object, right.object);
133 return object == right.object;
138 return !(*
this == right);
147 template<
typename native_t>
151 std::shared_ptr<native_t> object;
155 :
object{std::move(
object)}
159 std::shared_ptr<native_t> ref_ptr()
const
175 *
this = std::move(other);
178 native_t *c_ptr()
const
181 throw std::runtime_error(
"Tried to access empty object");
185 bool has_object()
const
190 operator bool()
const
195 operator native_t*()
const
205 object = right.object;
211 std::swap(
object, right.object);
217 return object == right.object;
222 return !(*
this == right);
233 base(
const base&) =
default;
234 base(base&&) noexcept = default;
235 base& operator=(const base&) = default;
236 base& operator=(base&&) noexcept = default;
237 virtual ~base() noexcept = default;
238 virtual const std::type_info &type_info() const = 0;
239 virtual base *clone() const = 0;
242 template <typename T>
243 class derived : public base
251 : val(std::move(t)) { }
253 const std::type_info &type_info()
const override
258 base *clone()
const override
260 return new derived<T>(val);
270 : val(a.val ? a.val->clone() : nullptr) { }
272 any(any &&a) noexcept
274 operator=(std::move(a));
277 template <
typename T>
279 : val(new derived<T>(t)) { }
286 any &operator=(
const any &a)
291 val = a.val ? a.val->clone() :
nullptr;
296 any &operator=(any &&a) noexcept
298 std::swap(val, a.val);
302 template <
typename T>
303 any &operator=(
const T &t)
305 if(val &&
typeid(T) == val->type_info())
306 static_cast<derived<T>*
>(val)->val = t;
310 val =
new derived<T>(t);
315 template <
typename T>
318 if(val &&
typeid(T) == val->type_info())
319 return static_cast<derived<T>*
>(val)->val;
320 throw std::bad_cast();
323 template <
typename T>
326 if(val &&
typeid(T) == val->type_info())
327 return static_cast<derived<T>*
>(val)->val;
328 throw std::bad_cast();
332 template<
unsigned int size,
int id = 0>
336 static const uint32_t mask = (1 << size) - 1;
339 explicit bitfield(
const uint32_t value = 0)
344 explicit operator uint32_t()
const
349 operator bool()
const
354 bitfield(
const bitfield<size, id> &b)
359 bitfield(bitfield<size, id>&&) noexcept = default;
361 ~bitfield() noexcept = default;
363 bool operator==(const bitfield<size,
id> &b)
368 bool operator!=(
const bitfield<size, id> &b)
370 return !operator==(b);
373 bitfield<size, id> &operator=(
const bitfield<size, id> &b)
377 v =
static_cast<uint32_t
>(b);
381 bitfield<size, id> &operator=(bitfield<size, id> &&) noexcept = default;
383 bitfield<size,
id> operator|(const bitfield<size,
id> &b)
const
385 return bitfield<size, id>(v |
static_cast<uint32_t
>(b));
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)) & mask);
398 bitfield<size, id> operator~()
const
400 return bitfield<size, id>(~v & mask);
403 bitfield<size, id> &operator|=(
const bitfield<size, id> &b)
405 operator=(*
this | b);
409 bitfield<size, id> &operator&=(
const bitfield<size, id> &b)
411 operator=(*
this & b);
415 bitfield<size, id> &operator^=(
const bitfield<size, id> &b)
417 operator=(*
this ^ b);
425 wl_argument argument = { .i = 0 };
426 bool is_array{
false};
429 argument_t() =
default;
432 argument_t(
const argument_t &arg);
433 argument_t(argument_t &&) noexcept = default;
434 argument_t &operator=(const argument_t &arg);
435 argument_t &operator=(argument_t&&) noexcept = default;
436 ~argument_t() noexcept;
439 argument_t(uint32_t i);
440 argument_t(int32_t i);
443 argument_t(
double f);
446 argument_t(const std::
string &s);
449 argument_t(wl_object *o);
452 argument_t(const array_t& a);
455 argument_t(std::nullptr_t);
458 static argument_t fd(
int fileno);
463 wl_argument get_c_argument() const;
470 wl_array a = { 0, 0,
nullptr };
472 array_t(wl_array *arr);
473 void get(wl_array *arr)
const;
475 friend class proxy_t;
476 friend class detail::argument_t;
480 array_t(
const array_t &arr);
481 array_t(array_t &&arr) noexcept;
483 template <
typename T> array_t(
const std::vector<T> &v)
486 wl_array_add(&a, v.size()*
sizeof(T));
489 wl_array_for_each_cpp(p, &a)
494 array_t &operator=(
const array_t &arr);
495 array_t &operator=(array_t &&arr) noexcept;
497 template <
typename T> array_t &operator=(
const std::vector<T> &v)
499 wl_array_release(&a);
501 wl_array_add(&a, v.size()*
sizeof(T));
504 wl_array_for_each_cpp(p, &a)
509 template <
typename T>
operator std::vector<T>()
const
513 wl_array_for_each_cpp(p, &a)