parse: add non-const view overloads
This commit is contained in:
parent
5d123a5fd5
commit
3e9760d84f
34
parse.cpp
34
parse.cpp
@ -38,9 +38,18 @@ namespace {
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
template <typename ValueT>
|
template <
|
||||||
|
typename ValueT,
|
||||||
|
typename IteratorT,
|
||||||
|
typename = std::enable_if_t<
|
||||||
|
std::is_same_v<
|
||||||
|
std::remove_cv_t<IteratorT>,
|
||||||
|
char
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
ValueT
|
ValueT
|
||||||
c_iparse (cruft::view<char const*> &data)
|
c_iparse (cruft::view<IteratorT*> &data)
|
||||||
{
|
{
|
||||||
auto head = const_cast<char *> (data.begin ());
|
auto head = const_cast<char *> (data.begin ());
|
||||||
auto tail = head;
|
auto tail = head;
|
||||||
@ -55,9 +64,18 @@ namespace {
|
|||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
template <typename ValueT>
|
template <
|
||||||
|
typename ValueT,
|
||||||
|
typename IteratorT,
|
||||||
|
typename = std::enable_if_t<
|
||||||
|
std::is_same_v<
|
||||||
|
std::remove_cv_t<IteratorT>,
|
||||||
|
char
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
ValueT
|
ValueT
|
||||||
c_fparse (cruft::view<char const*> &data)
|
c_fparse (cruft::view<IteratorT*> &data)
|
||||||
{
|
{
|
||||||
auto head = const_cast<char *> (data.begin ());
|
auto head = const_cast<char *> (data.begin ());
|
||||||
auto tail = head;
|
auto tail = head;
|
||||||
@ -75,15 +93,19 @@ namespace {
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
/// Specialise cruft::parse for the type KLASS and dispatch the actual parsing
|
/// Specialise cruft::parse for the type KLASS and dispatch the actual parsing
|
||||||
/// to safe template wrappers around the C parsing functions.
|
/// to safe template wrappers around the C parsing functions.
|
||||||
#define C_PARSE(PREFIX, KLASS) \
|
#define C_PARSE_ITERATOR(ITERATOR,PREFIX, KLASS)\
|
||||||
template <> \
|
template <> \
|
||||||
KLASS \
|
KLASS \
|
||||||
cruft::parse<KLASS> ( \
|
cruft::parse<KLASS> ( \
|
||||||
cruft::view<const char *> &str \
|
cruft::view<ITERATOR> &str \
|
||||||
) { \
|
) { \
|
||||||
return c_ ## PREFIX ## parse<KLASS> (str); \
|
return c_ ## PREFIX ## parse<KLASS> (str); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define C_PARSE(PREFIX,KLASS) \
|
||||||
|
C_PARSE_ITERATOR(char *, PREFIX, KLASS) \
|
||||||
|
C_PARSE_ITERATOR(char const *, PREFIX, KLASS)
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
MAP1(C_PARSE, i,
|
MAP1(C_PARSE, i,
|
||||||
|
@ -17,9 +17,8 @@ namespace cruft {
|
|||||||
/// Throws std::invalid_argument when the type cannot be parsed.
|
/// Throws std::invalid_argument when the type cannot be parsed.
|
||||||
///
|
///
|
||||||
/// The view is modified in place to reflect the unused data.
|
/// The view is modified in place to reflect the unused data.
|
||||||
template <typename T>
|
template <typename T> T parse (cruft::view<const char *> &);
|
||||||
T
|
template <typename T> T parse (cruft::view< char *> &);
|
||||||
parse (cruft::view<const char *> &);
|
|
||||||
|
|
||||||
|
|
||||||
/// Parses a prefix string to obtain an instance of T.
|
/// Parses a prefix string to obtain an instance of T.
|
||||||
|
Loading…
Reference in New Issue
Block a user