Adds EncodeSlice, EncodeSliceCast, EncodeSliceFn, and their decoder counterparts, as well as Cast methods for increased type safety. This makes most encoding methods more succinct, but the real motivation was that it allows us to centralized the handling of malicious slice lengths (see discussion on #166). I will grudgingly admit that generics solved a real problem here. 😝
I'm not crazy about the API; it would be nicer if we could somehow unify these three functions, and if we could ditch the Cast methods. I explored replacing EncodeSliceFn with a BasicEncodable type (wrapping uint64, bool, etc.), but it was kinda gross, requiring a run-time type-switch on every encode call.
I ran one manual benchmark to see whether this had a big performance impact, and it looked ok. We should benchmark it more thoroughly though.
Adds
EncodeSlice
,EncodeSliceCast
,EncodeSliceFn
, and their decoder counterparts, as well asCast
methods for increased type safety. This makes most encoding methods more succinct, but the real motivation was that it allows us to centralized the handling of malicious slice lengths (see discussion on #166). I will grudgingly admit that generics solved a real problem here. 😝I'm not crazy about the API; it would be nicer if we could somehow unify these three functions, and if we could ditch the
Cast
methods. I explored replacingEncodeSliceFn
with aBasicEncodable
type (wrappinguint64
,bool
, etc.), but it was kinda gross, requiring a run-time type-switch on every encode call.I ran one manual benchmark to see whether this had a big performance impact, and it looked ok. We should benchmark it more thoroughly though.