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); \
60 int check_return_value(
int return_value, std::string
const &function_name);
67 template<
typename native_t>
71 native_t *
object =
nullptr;
90 *
this = std::move(other);
93 native_t *c_ptr()
const
96 throw std::runtime_error(
"Tried to access empty object");
100 bool has_object()
const
105 operator bool()
const
110 operator native_t*()
const
120 object = right.object;
126 std::swap(
object, right.object);
132 return object == right.object;
137 return !(*
this == right);
146 template<
typename native_t>
150 std::shared_ptr<native_t> object;
154 :
object{std::move(
object)}
158 std::shared_ptr<native_t> ref_ptr()
const
174 *
this = std::move(other);
177 native_t *c_ptr()
const
180 throw std::runtime_error(
"Tried to access empty object");
184 bool has_object()
const
189 operator bool()
const
194 operator native_t*()
const
204 object = right.object;
210 std::swap(
object, right.object);
216 return object == right.object;
221 return !(*
this == right);
232 base(
const base&) =
default;
233 base(base&&) noexcept = default;
234 base& operator=(const base&) = default;
235 base& operator=(base&&) noexcept = default;
236 virtual ~base() noexcept = default;
237 virtual const std::type_info &type_info() const = 0;
238 virtual base *clone() const = 0;
241 template <typename T>
242 class derived : public base
250 : val(std::move(t)) { }
252 const std::type_info &type_info()
const override
257 base *clone()
const override
259 return new derived<T>(val);
269 : val(a.val ? a.val->clone() : nullptr) { }
271 any(any &&a) noexcept
273 operator=(std::move(a));
276 template <
typename T>
278 : val(new derived<T>(t)) { }
285 any &operator=(
const any &a)
290 val = a.val ? a.val->clone() :
nullptr;
295 any &operator=(any &&a) noexcept
297 std::swap(val, a.val);
301 template <
typename T>
302 any &operator=(
const T &t)
304 if(val &&
typeid(T) == val->type_info())
305 static_cast<derived<T>*
>(val)->val = t;
309 val =
new derived<T>(t);
314 template <
typename T>
317 if(val &&
typeid(T) == val->type_info())
318 return static_cast<derived<T>*
>(val)->val;
319 throw std::bad_cast();
322 template <
typename T>
325 if(val &&
typeid(T) == val->type_info())
326 return static_cast<derived<T>*
>(val)->val;
327 throw std::bad_cast();
331 template<
unsigned int size,
int id = 0>
335 static const uint32_t mask = (1 << size) - 1;
338 explicit bitfield(
const uint32_t value = 0)
343 explicit operator uint32_t()
const
348 operator bool()
const
353 bitfield(
const bitfield<size, id> &b)
358 bitfield(bitfield<size, id>&&) noexcept = default;
360 ~bitfield() noexcept = default;
362 bool operator==(const bitfield<size,
id> &b)
367 bool operator!=(
const bitfield<size, id> &b)
369 return !operator==(b);
372 bitfield<size, id> &operator=(
const bitfield<size, id> &b)
376 v =
static_cast<uint32_t
>(b);
380 bitfield<size, id> &operator=(bitfield<size, id> &&) noexcept = default;
382 bitfield<size,
id> operator|(const bitfield<size,
id> &b)
const
384 return bitfield<size, id>(v |
static_cast<uint32_t
>(b));
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)) & mask);
397 bitfield<size, id> operator~()
const
399 return bitfield<size, id>(~v & mask);
402 bitfield<size, id> &operator|=(
const bitfield<size, id> &b)
404 operator=(*
this | b);
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);
424 wl_argument argument = { .i = 0 };
425 bool is_array{
false};
428 argument_t() =
default;
431 argument_t(
const argument_t &arg);
432 argument_t(argument_t &&) noexcept = default;
433 argument_t &operator=(const argument_t &arg);
434 argument_t &operator=(argument_t&&) noexcept = default;
435 ~argument_t() noexcept;
438 argument_t(uint32_t i);
439 argument_t(int32_t i);
442 argument_t(
double f);
445 argument_t(const std::
string &s);
448 argument_t(wl_object *o);
451 argument_t(const array_t& a);
454 argument_t(std::nullptr_t);
457 static argument_t fd(
int fileno);
462 wl_argument get_c_argument() const;
469 wl_array a = { 0, 0,
nullptr };
471 array_t(wl_array *arr);
472 void get(wl_array *arr)
const;
474 friend class proxy_t;
475 friend class detail::argument_t;
479 array_t(
const array_t &arr);
480 array_t(array_t &&arr) noexcept;
482 template <
typename T> array_t(
const std::vector<T> &v)
485 wl_array_add(&a, v.size()*
sizeof(T));
488 wl_array_for_each_cpp(p, &a)
493 array_t &operator=(
const array_t &arr);
494 array_t &operator=(array_t &&arr) noexcept;
496 template <
typename T> array_t &operator=(
const std::vector<T> &v)
498 wl_array_release(&a);
500 wl_array_add(&a, v.size()*
sizeof(T));
503 wl_array_for_each_cpp(p, &a)
508 template <
typename T>
operator std::vector<T>()
const
512 wl_array_for_each_cpp(p, &a)