1- // ================================= array_REF ====== ============================= //
1+ // ============================= to_from_string ============================= //
22// Project: The Experimental Bit Algorithms Library
3- // \file to_string .hpp
4- // Description: Implementation of array_ref
3+ // \file to_from_string .hpp
4+ // Description: Implementation of to_string and from_string
55// Creator: Vincent Reverdy
66// Contributor: Peter McLean [2025]
77// License: BSD 3-Clause License
@@ -275,7 +275,7 @@ constexpr CharIt to_string(
275275 return to_string (bits, str_first, str_last, meta);
276276}
277277
278- template <typename CharIt, typename RandomAccessIt, typename Policy = policy::typical<typename RandomAccessIt::value_type>>
278+ template <typename CharIt, typename RandomAccessIt, typename Policy = policy::typical<typename std::iterator_traits< RandomAccessIt> ::value_type>>
279279constexpr void from_string (
280280 const CharIt str_first, const CharIt str_last,
281281 const bit_iterator<RandomAccessIt>& bit_first, const bit_iterator<RandomAccessIt>& bit_last,
@@ -356,7 +356,7 @@ constexpr void from_string(
356356template <string::metadata_t meta = string::typical(),
357357 typename CharIt,
358358 typename RandomAccessIt,
359- typename Policy = policy::typical<typename RandomAccessIt::value_type>>
359+ typename Policy = policy::typical<typename std::iterator_traits< RandomAccessIt> ::value_type>>
360360constexpr void from_string (
361361 const CharIt str_first, const CharIt str_last,
362362 const bit_iterator<RandomAccessIt>& bit_first, const bit_iterator<RandomAccessIt>& bit_last) {
@@ -410,15 +410,15 @@ constexpr std::vector<uintptr_t> from_string(
410410 return from_string (first, last, meta);
411411}
412412
413- template <string::metadata_t meta = string::typical(), typename RandomAccessIt, typename Policy = policy::typical<typename RandomAccessIt::value_type>>
413+ template <string::metadata_t meta = string::typical(), typename RandomAccessIt, typename Policy = policy::typical<typename std::iterator_traits< RandomAccessIt> ::value_type>>
414414constexpr void from_string (
415415 const std::string& str,
416416 const bit_iterator<RandomAccessIt>& bit_first, const bit_iterator<RandomAccessIt>& bit_last) {
417417 static_assert (meta.endian == std::endian::big, " Only bit big endian support (MSB on the left)" );
418418 from_string<meta, RandomAccessIt, Policy>(str.c_str (), str.c_str () + str.length (), bit_first, bit_last);
419419}
420420
421- template <string::metadata_t meta = string::typical(), bit_range RangeT, typename Policy = policy::typical<typename std::ranges::iterator_t <RangeT>::value_type >>
421+ template <string::metadata_t meta = string::typical(), bit_range RangeT, typename Policy = policy::typical<typename std::ranges::iterator_t <RangeT>::word_type >>
422422constexpr void from_string (
423423 const std::string& str,
424424 RangeT&& bits) {
@@ -427,7 +427,7 @@ constexpr void from_string(
427427 from_string<meta, std::string::const_iterator, RandomAccessIt, Policy>(str.begin (), str.end (), bits.begin (), bits.end ());
428428}
429429
430- template <typename RandomAccessIt, typename Policy = policy::typical<typename RandomAccessIt::value_type>>
430+ template <typename RandomAccessIt, typename Policy = policy::typical<typename std::iterator_traits< RandomAccessIt> ::value_type>>
431431constexpr void from_string (
432432 const std::string& str,
433433 const bit_iterator<RandomAccessIt>& bit_first, const bit_iterator<RandomAccessIt>& bit_last,
@@ -438,7 +438,7 @@ constexpr void from_string(
438438 meta);
439439}
440440
441- template <bit_range RangeT, typename Policy = policy::typical<typename std::ranges::iterator_t <RangeT>::value_type >>
441+ template <bit_range RangeT, typename Policy = policy::typical<typename std::ranges::iterator_t <RangeT>::word_type >>
442442constexpr void from_string (
443443 const std::string& str,
444444 RangeT&& bits,
@@ -451,6 +451,25 @@ constexpr void from_string(
451451 meta);
452452}
453453
454+ template <typename CharIt, bit_range RangeT, typename Policy = policy::typical<typename std::ranges::iterator_t <RangeT>::word_type>>
455+ constexpr void from_string (
456+ const CharIt first, const CharIt last,
457+ RangeT&& bits,
458+ string::metadata_t meta = string::typical()) {
459+ using range_iterator_t = std::ranges::iterator_t <RangeT>;
460+ using RandomAccessIt = typename range_iterator_t ::iterator_type;
461+ from_string<CharIt, RandomAccessIt, Policy>(first, last, bits.begin (), bits.end (), meta);
462+ }
463+
464+ template <string::metadata_t meta = string::typical(), typename CharIt, bit_range RangeT, typename Policy = policy::typical<typename std::ranges::iterator_t <RangeT>::word_type>>
465+ constexpr void from_string (
466+ const CharIt first, const CharIt last,
467+ RangeT&& bits) {
468+ using range_iterator_t = std::ranges::iterator_t <RangeT>;
469+ using RandomAccessIt = typename range_iterator_t ::iterator_type;
470+ return from_string<CharIt, RandomAccessIt, Policy>(first, last, bits.begin (), bits.end (), meta);
471+ }
472+
454473} // namespace bit
455474
456- #endif // _BIT_TO_STRING_HPP_INCLUDED
475+ #endif // _BIT_TO_STRING_HPP_INCLUDED
0 commit comments