Skip to content

Commit 464acce

Browse files
Add additional from_string variants (#30)
* Add additional from_string variants * clang format
1 parent 65d3132 commit 464acce

1 file changed

Lines changed: 29 additions & 10 deletions

File tree

include/bitlib/bit-algorithms/to_from_string.hpp

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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>>
279279
constexpr 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(
356356
template <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>>
360360
constexpr 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>>
414414
constexpr 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>>
422422
constexpr 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>>
431431
constexpr 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>>
442442
constexpr 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

Comments
 (0)