co_usb
Loading...
Searching...
No Matches
device_handle_source.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <concepts>
4#include <libusb.h>
5#include <type_traits>
6#include <utility>
7
8namespace co_usb::detail
9{
10
23template <typename Ty>
25 std::same_as<std::remove_cvref_t<Ty>, libusb_device_handle *> || requires(const Ty dev) {
26 { dev.get() } -> std::same_as<libusb_device_handle *>;
27 };
28
41template <typename Ty>
42concept DeviceHandleSource = DeviceHandlePointer<Ty> || requires(const Ty src) {
43 { src.devh() } -> DeviceHandlePointer;
44};
45
57template <DeviceHandlePointer Ty> auto device_handle_of (Ty &&devh) -> libusb_device_handle *
58{
59 if constexpr (std::same_as<std::remove_cvref_t<Ty>, libusb_device_handle *>)
60 {
61 return devh;
62 }
63 else
64 {
65 return std::forward<Ty>(devh).get();
66 }
67}
68
80template <DeviceHandleSource Ty> auto device_handle_of (Ty &&devh_src) -> libusb_device_handle *
81{
82 if constexpr (DeviceHandlePointer<Ty>)
83 {
84 return device_handle_of(std::forward<Ty>(devh_src));
85 }
86 return device_handle_of(std::forward<Ty>(devh_src).devh());
87}
88
89} // namespace co_usb::detail
A type which can provide libusb_device_handle *.
Definition device_handle_source.hpp:24
A type which can provide a co_usb::detail::DeviceHandlePointer.
Definition device_handle_source.hpp:42
auto device_handle_of(Ty &&devh) -> libusb_device_handle *
Obtains a libusb_device_handle * from a co_usb::detail::DeviceHandlePointer.
Definition device_handle_source.hpp:57
Definition flag_type.hpp:6