43 explicit bitstream_type_hint(T&& value) : wrapper_{std::make_shared<wrapper<T>>(std::forward<T>(value))} {}
49 [[nodiscard]] abi::string
name()
const {
50 return wrapper_->name();
58 return wrapper_->file_extensions();
66 return wrapper_->leading_signature_size();
74 return wrapper_->leading_signature();
82 return wrapper_->leading_signature_str();
90 return wrapper_->trailing_signature_size();
98 return wrapper_->trailing_signature();
106 return wrapper_->trailing_signature_str();
111 virtual ~base() =
default;
112 virtual abi::string name() = 0;
113 virtual std::span<const abi::string> file_extensions() = 0;
114 virtual std::size_t leading_signature_size() = 0;
115 virtual std::span<const std::byte> leading_signature() = 0;
116 virtual std::string_view leading_signature_str() = 0;
117 virtual std::size_t trailing_signature_size() = 0;
118 virtual std::span<const std::byte> trailing_signature() = 0;
119 virtual std::string_view trailing_signature_str() = 0;
122 template <
typename T>
123 class wrapper final :
public base {
125 template <std::convertible_to<T> U>
126 explicit wrapper(U&& value) : value_{std::forward<U>(value)} {}
128 abi::string name()
override {
129 return value_.name();
132 std::span<const abi::string> file_extensions()
override {
133 return value_.file_extensions();
136 std::size_t leading_signature_size()
override {
137 return value_.leading_signature_size();
140 std::span<const std::byte> leading_signature()
override {
141 return value_.leading_signature();
144 std::string_view leading_signature_str()
override {
145 return value_.leading_signature_str();
148 std::size_t trailing_signature_size()
override {
149 return value_.trailing_signature_size();
152 std::span<const std::byte> trailing_signature()
override {
153 return value_.trailing_signature();
156 std::string_view trailing_signature_str()
override {
157 return value_.trailing_signature_str();
164 std::shared_ptr<base> wrapper_;