26 #ifndef WAYLAND_UTIL_HPP 27 #define WAYLAND_UTIL_HPP 36 #include <wayland-client-core.h> 38 #define wl_array_for_each_cpp(pos, array) \ 39 for (pos = (decltype(pos))(array)->data; \ 40 (const char *) pos < ((const char *) (array)->data + (array)->size); \ 59 int check_return_value(
int return_value, std::string
const &function_name);
66 template<
typename native_t>
70 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;
158 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 virtual const std::type_info &type_info()
const = 0;
234 virtual base *clone()
const = 0;
237 template <
typename T>
238 class derived :
public base
248 virtual const std::type_info &type_info()
const override 253 virtual base *clone()
const override 255 return new derived<T>(val);
266 : val(a.val ? a.val->clone() : nullptr) { }
268 template <
typename T>
270 : val(new derived<T>(t)) { }
277 any &operator=(
const any &a)
280 val = a.val ? a.val->clone() :
nullptr;
284 template <
typename T>
285 any &operator=(
const T &t)
287 if(val &&
typeid(T) == val->type_info())
288 static_cast<derived<T>*
>(val)->val = t;
292 val =
new derived<T>(t);
297 template <
typename T>
300 if(val &&
typeid(T) == val->type_info())
301 return static_cast<derived<T>*
>(val)->val;
303 throw std::bad_cast();
307 template<
unsigned int size,
int id = 0>
311 static const uint32_t mask = (1 << size) - 1;
314 explicit bitfield(
const uint32_t value = 0)
319 explicit operator uint32_t()
const 324 operator bool()
const 329 bitfield(
const bitfield<size, id> &b)
334 bool operator==(
const bitfield<size, id> &b)
339 bool operator!=(
const bitfield<size, id> &b)
341 return !operator==(b);
344 bitfield<size, id> &operator=(
const bitfield<size, id> &b)
346 v = static_cast<uint32_t>(b);
350 bitfield<size, id> operator|(
const bitfield<size, id> &b)
const 352 return bitfield<size, id>(v | static_cast<uint32_t>(b));
355 bitfield<size, id> operator&(
const bitfield<size, id> &b)
const 357 return bitfield<size, id>(v & static_cast<uint32_t>(b));
360 bitfield<size, id> operator^(
const bitfield<size, id> &b)
const 362 return bitfield<size, id>((v ^ static_cast<uint32_t>(b)) & mask);
365 bitfield<size, id> operator~()
const 367 return bitfield<size, id>(~v & mask);
370 bitfield<size, id> &operator|=(
const bitfield<size, id> &b)
372 operator=(*
this | b);
376 bitfield<size, id> &operator&=(
const bitfield<size, id> &b)
378 operator=(*
this & b);
382 bitfield<size, id> &operator^=(
const bitfield<size, id> &b)
384 operator=(*
this ^ b);
392 bool is_array{
false};
397 wl_argument argument;
399 argument_t(
const argument_t &arg);
400 argument_t &operator=(
const argument_t &arg);
404 argument_t(uint32_t i);
405 argument_t(int32_t i);
408 argument_t(
double f);
411 argument_t(
const std::string &s);
414 argument_t(wl_object *o);
417 argument_t(array_t a);
420 argument_t(std::nullptr_t);
423 static argument_t fd(
int fileno);
432 array_t(wl_array *arr);
433 void get(wl_array *arr)
const;
435 friend class proxy_t;
436 friend class detail::argument_t;
440 array_t(
const array_t &arr);
441 array_t(array_t &&arr);
443 template <
typename T> array_t(
const std::vector<T> &v)
446 wl_array_add(&a, v.size()*
sizeof(T));
449 wl_array_for_each_cpp(p, &a)
454 array_t &operator=(
const array_t &arr);
455 array_t &operator=(array_t &&arr);
457 template <
typename T> array_t &operator=(
const std::vector<T> &v)
459 wl_array_release(&a);
461 wl_array_add(&a, v.size()*
sizeof(T));
464 wl_array_for_each_cpp(p, &a)
469 template <
typename T>
operator std::vector<T>()
const 473 wl_array_for_each_cpp(p, &a)
Refcounted wrapper for C objects.
Non-refcounted wrapper for C objects.