@@ -83,8 +83,8 @@ template <typename T> concept has_conversion = requires {
8383
8484template <typename > struct identify ;
8585
86- template <typename Encoding, typename R, typename ByteT = a_byte_type> struct decode_view {
87- using properties = encoding_properties<Encoding>;
86+ template <auto Encoding, typename R, typename ByteT = a_byte_type> struct decode_view {
87+ using properties = encoding_properties<decltype ( Encoding) >;
8888 // output is 8
8989 // input depends on the encoding
9090 using chunk_view = cthash::chunk_of_bits_view<8 , properties::has_padding, R, properties::bits, properties>;
@@ -143,7 +143,7 @@ template <typename Encoding, typename R, typename ByteT = a_byte_type> struct de
143143 }
144144};
145145
146- template <typename Encoding, typename ByteT = a_byte_type> struct decode_action {
146+ template <auto Encoding, typename ByteT = a_byte_type> struct decode_action {
147147 template <std::ranges::input_range R> constexpr friend auto operator |(R && input, decode_action action) requires (character<std::ranges::range_value_t <R>>) {
148148 return action.operator ()<R>(std::forward<R>(input));
149149 }
@@ -235,7 +235,7 @@ template <typename Encoding, typename R, typename CharT = a_character_type> stru
235235 }
236236};
237237
238- template <typename Encoding, typename CharT = a_character_type>
238+ template <typename Encoding = void , typename CharT = a_character_type>
239239struct encode_action {
240240 template <std::ranges::input_range R> constexpr friend auto operator |(R && input, encode_action action) {
241241 return action.operator ()<R>(std::forward<R>(input));
@@ -246,49 +246,57 @@ struct encode_action {
246246};
247247
248248// just aliases to existing encodings
249- using base2 = encoding::base2;
250- using binary = encoding::base2;
251- using base4 = encoding::base4;
252- using base8 = encoding::base8;
253- using octal = encoding::base8;
254- using base8_no_padding = encoding::base8_no_padding;
255- using octal_no_padding = encoding::base8_no_padding;
256- using base16 = encoding::base16;
257- using base16_uppercase = encoding::base16_uppercase;
258- using hexdec = encoding::base16;
259- using hexdec_uppercase = encoding::base16_uppercase;
260- using base32 = encoding::base32;
261- using base32_no_padding = encoding::base32_no_padding;
262- using z_base32 = encoding::z_base32;
263- using base64 = encoding::base64;
264- using base64url = encoding::base64url;
265- using base64_no_padding = encoding::base64_no_padding;
249+ static constexpr auto base2 = encoding::base2{};
250+ static constexpr auto binary = encoding::base2{};
251+ static constexpr auto base4 = encoding::base4{};
252+ static constexpr auto base8 = encoding::base8{};
253+ static constexpr auto octal = encoding::base8{};
254+ static constexpr auto base8_no_padding = encoding::base8_no_padding{};
255+ static constexpr auto octal_no_padding = encoding::base8_no_padding{};
256+ static constexpr auto base16 = encoding::base16{};
257+ static constexpr auto base16_uppercase = encoding::base16_uppercase{};
258+ static constexpr auto hexdec = encoding::base16{};
259+ static constexpr auto hexdec_uppercase = encoding::base16_uppercase{};
260+ static constexpr auto base32 = encoding::base32{};
261+ static constexpr auto base32_no_padding = encoding::base32_no_padding{};
262+ static constexpr auto z_base32 = encoding::z_base32{};
263+ static constexpr auto base64 = encoding::base64{};
264+ static constexpr auto base64url = encoding::base64url{};
265+ static constexpr auto base64_no_padding = encoding::base64_no_padding{};
266+
267+ static constexpr auto unknown = encoding::unknown{};
266268
267269// encoding / decoding interface
268- template <typename Encoding, typename CharT = a_character_type> constexpr auto encode = encode_action<Encoding, CharT>{};
269- template <typename Encoding, typename ByteT = a_byte_type> constexpr auto decode = decode_action<Encoding, ByteT>{};
270+
271+ template <typename CharT = a_character_type, encoding_type T> consteval auto encode (T) {
272+ return encode_action<T, CharT>{};
273+ }
274+
275+ template <typename CharT = a_byte_type, encoding_type T> consteval auto decode (T) {
276+ return decode_action<T{}, CharT>{};
277+ }
270278
271279// for compatibility with the old API
272- constexpr auto binary_encode = encode< base2, char >;
273- constexpr auto base2_encode = encode< base2, char >;
274- constexpr auto base4_encode = encode< base4, char >;
275- constexpr auto base8_encode = encode< base8, char >;
276- constexpr auto octal_encode = encode< base8, char >;
277- constexpr auto base8_no_padding_encode = encode< base8_no_padding, char >;
278- constexpr auto octal_no_padding_encode = encode< base8_no_padding, char >;
279- constexpr auto hexdec_encode = encode< base16, char >;
280- constexpr auto hexdec_uppercase_encode = encode< base16_uppercase, char >;
281- constexpr auto base16_encode = encode< base16, char >;
282- constexpr auto base32_encode = encode< base32, char >;
283- constexpr auto base32_no_padding_encode = encode< base32_no_padding, char >;
284- constexpr auto z_base32_encode = encode< z_base32, char >;
285- constexpr auto base64_encode = encode< base64, char >;
286- constexpr auto base64url_encode = encode< base64url, char >;
287- constexpr auto base64_no_padding_encode = encode< base64_no_padding, char >;
280+ constexpr auto binary_encode = encode_action<encoding:: base2, char >{} ;
281+ constexpr auto base2_encode = encode_action<encoding:: base2, char >{} ;
282+ constexpr auto base4_encode = encode_action<encoding:: base4, char >{} ;
283+ constexpr auto base8_encode = encode_action<encoding:: base8, char >{} ;
284+ constexpr auto octal_encode = encode_action<encoding:: base8, char >{} ;
285+ constexpr auto base8_no_padding_encode = encode_action<encoding:: base8_no_padding, char >{} ;
286+ constexpr auto octal_no_padding_encode = encode_action<encoding:: base8_no_padding, char >{} ;
287+ constexpr auto hexdec_encode = encode_action<encoding:: base16, char >{} ;
288+ constexpr auto hexdec_uppercase_encode = encode_action<encoding:: base16_uppercase, char >{} ;
289+ constexpr auto base16_encode = encode_action<encoding:: base16, char >{} ;
290+ constexpr auto base32_encode = encode_action<encoding:: base32, char >{} ;
291+ constexpr auto base32_no_padding_encode = encode_action<encoding:: base32_no_padding, char >{} ;
292+ constexpr auto z_base32_encode = encode_action<encoding:: z_base32, char >{} ;
293+ constexpr auto base64_encode = encode_action<encoding:: base64, char >{} ;
294+ constexpr auto base64url_encode = encode_action<encoding:: base64url, char >{} ;
295+ constexpr auto base64_no_padding_encode = encode_action<encoding:: base64_no_padding, char >{} ;
288296
289297// same here
290298template <typename Encoding, typename CharT = char > constexpr auto encode_to = encode_action<Encoding, CharT>{};
291- template <typename Encoding, typename ByteT = std::byte> constexpr auto decode_from = decode_action<Encoding, ByteT>{};
299+ template <typename Encoding, typename ByteT = std::byte> constexpr auto decode_from = decode_action<Encoding{} , ByteT>{};
292300
293301} // namespace cthash
294302
0 commit comments