view: add a method to extract type cast bytes from a view
This commit is contained in:
parent
ab495bb0f7
commit
2c47a3654d
30
view.hpp
30
view.hpp
@ -588,6 +588,36 @@ namespace util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
/// extract a reference to a known type at the front of a byte-view
|
||||||
|
///
|
||||||
|
/// returns a reference to a value of the designated type at the front of
|
||||||
|
/// the byte-view, or throws an exception if there is insufficient data.
|
||||||
|
///
|
||||||
|
/// there are no validity or other checks performed on the returned data
|
||||||
|
/// (other than memory safety wrt to the view). this is deliberate, so
|
||||||
|
/// that the function is safe to call on user supplied data during
|
||||||
|
/// parsing routines. it is up to the user to ensure the object is valid.
|
||||||
|
///
|
||||||
|
/// the buffer object is advanced in place so that it no longer covers
|
||||||
|
/// the extract value
|
||||||
|
template <
|
||||||
|
typename ValueT,
|
||||||
|
typename ByteT,
|
||||||
|
typename = std::enable_if_t<sizeof (ByteT) == 1>
|
||||||
|
>
|
||||||
|
ValueT const&
|
||||||
|
extract (util::view<const ByteT*> &buffer)
|
||||||
|
{
|
||||||
|
if (buffer.size () < sizeof (ValueT))
|
||||||
|
throw std::runtime_error ("insufficient data for view shift");
|
||||||
|
|
||||||
|
ValueT const &res = *reinterpret_cast<ValueT const*> (buffer.data ());
|
||||||
|
buffer = buffer.consume (sizeof (ValueT));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
template <
|
template <
|
||||||
typename BeginA, typename EndA,
|
typename BeginA, typename EndA,
|
||||||
|
Loading…
Reference in New Issue
Block a user