On 26/03/2017 15:28, Artyom Beilis via Boost wrote:
Still do you have examples or documentation for:
How do I cast for example low part or high part something like:
pack v;
pack v1=cast_low(v); // note sometimes I indeed need
only low or only high part - not both
pack v2=cast_high(v);
...
v=join_cast(v1,v2); // short to byte
What is saturation policy: if I have unsigned short of value 257
casted to unsigned char would it cast to 1 or to 255?
How can I control the policy?
If you only need part of it, it's not a cast, it's a split as cast
preserve cardinality of pack.
pack v;
pack v1=split_low(v);
pack v2=split_high(v);
and if you need both :
pack v;
auto vs = split(v);
and vs[0],vs[1] are the low and high parts respectively.
IIRC split has no saturation policy as saturation is what we use when
you go down the type. You can rebuild a smaller type using group or
saturated_(group).
You also have slice that slice a pack in two, keeping the type but
reducing the cardinal. combine do the reverse.
Considering this complexity, most of the common use-cases are handled by
pack_cast already, leaving direct call to split_* for more advanced usages.
As for the doc, thanks for raising an actual bug, the doc is not indeed
properly included. Will fix this.
Maybe a tutorial about pack_cast,slice,split,group and combine is indeed
needed.