27 #ifndef WAYLAND_UTIL_HPP 28 #define WAYLAND_UTIL_HPP 37 #include <wayland-client-core.h> 39 #define wl_array_for_each_cpp(pos, array) \ 40 for (pos = (decltype(pos))(array)->data; \ 41 (const char *) pos < ((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;
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;
159 std::shared_ptr<native_t> ref_ptr()
const 176 *
this = std::move(other);
179 native_t *c_ptr()
const 182 throw std::runtime_error(
"Tried to access empty object");
186 bool has_object()
const 191 operator bool()
const 196 operator native_t*()
const 206 object = right.object;
212 std::swap(
object, right.object);
218 return object == right.object;
223 return !(*
this == right);
234 virtual const std::type_info &type_info()
const = 0;
235 virtual base *clone()
const = 0;
238 template <
typename T>
239 class derived :
public base
249 virtual const std::type_info &type_info()
const override 254 virtual base *clone()
const override 256 return new derived<T>(val);
267 : val(a.val ? a.val->clone() :
nullptr) { }
269 template <
typename T>
271 : val(
new derived<T>(t)) { }
278 any &operator=(
const any &a)
281 val = a.val ? a.val->clone() :
nullptr;
285 template <
typename T>
286 any &operator=(
const T &t)
288 if(val &&
typeid(T) == val->type_info())
289 static_cast<derived<T>*
>(val)->val = t;
293 val =
new derived<T>(t);
298 template <
typename T>
301 if(val &&
typeid(T) == val->type_info())
302 return static_cast<derived<T>*
>(val)->val;
304 throw std::bad_cast();
308 template<
unsigned int size,
int id = 0>
312 static const uint32_t mask = (1 << size) - 1;
315 explicit bitfield(
const uint32_t value = 0)
320 explicit operator uint32_t()
const 325 operator bool()
const 330 bitfield(
const bitfield<size, id> &b)
335 bool operator==(
const bitfield<size, id> &b)
340 bool operator!=(
const bitfield<size, id> &b)
342 return !operator==(b);
345 bitfield<size, id> &operator=(
const bitfield<size, id> &b)
347 v =
static_cast<uint32_t
>(b);
351 bitfield<size, id> operator|(
const bitfield<size, id> &b)
const 353 return bitfield<size, id>(v |
static_cast<uint32_t
>(b));
356 bitfield<size, id> operator&(
const bitfield<size, id> &b)
const 358 return bitfield<size, id>(v &
static_cast<uint32_t
>(b));
361 bitfield<size, id> operator^(
const bitfield<size, id> &b)
const 363 return bitfield<size, id>((v ^
static_cast<uint32_t
>(b)) & mask);
366 bitfield<size, id> operator~()
const 368 return bitfield<size, id>(~v & mask);
371 bitfield<size, id> &operator|=(
const bitfield<size, id> &b)
373 operator=(*
this | b);
377 bitfield<size, id> &operator&=(
const bitfield<size, id> &b)
379 operator=(*
this & b);
383 bitfield<size, id> &operator^=(
const bitfield<size, id> &b)
385 operator=(*
this ^ b);
393 bool is_array{
false};
398 wl_argument argument;
400 argument_t(
const argument_t &arg);
401 argument_t &operator=(
const argument_t &arg);
405 argument_t(uint32_t i);
406 argument_t(int32_t i);
409 argument_t(
double f);
412 argument_t(
const std::string &s);
415 argument_t(wl_object *o);
418 argument_t(array_t a);
421 argument_t(std::nullptr_t);
424 static argument_t fd(
int fileno);
433 array_t(wl_array *arr);
434 void get(wl_array *arr)
const;
437 friend class detail::argument_t;
441 array_t(
const array_t &arr);
442 array_t(array_t &&arr);
444 template <
typename T> array_t(
const std::vector<T> &v)
447 wl_array_add(&a, v.size()*
sizeof(T));
450 wl_array_for_each_cpp(p, &a)
455 array_t &operator=(
const array_t &arr);
456 array_t &operator=(array_t &&arr);
458 template <
typename T> array_t &operator=(
const std::vector<T> &v)
460 wl_array_release(&a);
462 wl_array_add(&a, v.size()*
sizeof(T));
465 wl_array_for_each_cpp(p, &a)
470 template <
typename T>
operator std::vector<T>()
const 474 wl_array_for_each_cpp(p, &a)
Represents a protocol object on the client side.
Refcounted wrapper for C objects.
Non-refcounted wrapper for C objects.