@@ -642,23 +642,14 @@ template<typename Stream, typename C> void Unserialize(Stream& is, std::basic_st
642
642
* prevector
643
643
* prevectors of unsigned char are a special case and are intended to be serialized as a single opaque blob.
644
644
*/
645
- template <typename Stream, unsigned int N, typename T> void Serialize_impl (Stream& os, const prevector<N, T>& v, const unsigned char &);
646
- template <typename Stream, unsigned int N, typename T, typename V> void Serialize_impl (Stream& os, const prevector<N, T>& v, const V&);
647
645
template <typename Stream, unsigned int N, typename T> inline void Serialize (Stream& os, const prevector<N, T>& v);
648
- template <typename Stream, unsigned int N, typename T> void Unserialize_impl (Stream& is, prevector<N, T>& v, const unsigned char &);
649
- template <typename Stream, unsigned int N, typename T, typename V> void Unserialize_impl (Stream& is, prevector<N, T>& v, const V&);
650
646
template <typename Stream, unsigned int N, typename T> inline void Unserialize (Stream& is, prevector<N, T>& v);
651
647
652
648
/* *
653
649
* vector
654
650
* vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob.
655
651
*/
656
- template <typename Stream, typename T, typename A> void Serialize_impl (Stream& os, const std::vector<T, A>& v, const unsigned char &);
657
- template <typename Stream, typename T, typename A> void Serialize_impl (Stream& os, const std::vector<T, A>& v, const bool &);
658
- template <typename Stream, typename T, typename A, typename V> void Serialize_impl (Stream& os, const std::vector<T, A>& v, const V&);
659
652
template <typename Stream, typename T, typename A> inline void Serialize (Stream& os, const std::vector<T, A>& v);
660
- template <typename Stream, typename T, typename A> void Unserialize_impl (Stream& is, std::vector<T, A>& v, const unsigned char &);
661
- template <typename Stream, typename T, typename A, typename V> void Unserialize_impl (Stream& is, std::vector<T, A>& v, const V&);
662
653
template <typename Stream, typename T, typename A> inline void Unserialize (Stream& is, std::vector<T, A>& v);
663
654
664
655
/* *
@@ -751,122 +742,82 @@ void Unserialize(Stream& is, std::basic_string<C>& str)
751
742
/* *
752
743
* prevector
753
744
*/
754
- template <typename Stream, unsigned int N, typename T>
755
- void Serialize_impl (Stream& os, const prevector<N, T>& v, const unsigned char &)
756
- {
757
- WriteCompactSize (os, v.size ());
758
- if (!v.empty ())
759
- os.write (MakeByteSpan (v));
760
- }
761
-
762
- template <typename Stream, unsigned int N, typename T, typename V>
763
- void Serialize_impl (Stream& os, const prevector<N, T>& v, const V&)
764
- {
765
- Serialize (os, Using<VectorFormatter<DefaultFormatter>>(v));
766
- }
767
-
768
- template <typename Stream, unsigned int N, typename T>
769
- inline void Serialize (Stream& os, const prevector<N, T>& v)
770
- {
771
- Serialize_impl (os, v, T ());
772
- }
773
-
774
-
775
- template <typename Stream, unsigned int N, typename T>
776
- void Unserialize_impl (Stream& is, prevector<N, T>& v, const unsigned char &)
777
- {
778
- // Limit size per read so bogus size value won't cause out of memory
779
- v.clear ();
780
- unsigned int nSize = ReadCompactSize (is);
781
- unsigned int i = 0 ;
782
- while (i < nSize)
783
- {
784
- unsigned int blk = std::min (nSize - i, (unsigned int )(1 + 4999999 / sizeof (T)));
785
- v.resize_uninitialized (i + blk);
786
- is.read (AsWritableBytes (Span{&v[i], blk}));
787
- i += blk;
745
+ template <typename Stream, unsigned int N, typename T>
746
+ void Serialize (Stream& os, const prevector<N, T>& v)
747
+ {
748
+ if constexpr (std::is_same_v<T, unsigned char >) {
749
+ WriteCompactSize (os, v.size ());
750
+ if (!v.empty ())
751
+ os.write (MakeByteSpan (v));
752
+ } else {
753
+ Serialize (os, Using<VectorFormatter<DefaultFormatter>>(v));
788
754
}
789
755
}
790
756
791
- template <typename Stream, unsigned int N, typename T, typename V>
792
- void Unserialize_impl (Stream& is, prevector<N, T>& v, const V&)
793
- {
794
- Unserialize (is, Using<VectorFormatter<DefaultFormatter>>(v));
795
- }
796
757
797
- template <typename Stream, unsigned int N, typename T>
798
- inline void Unserialize (Stream& is, prevector<N, T>& v)
758
+ template <typename Stream, unsigned int N, typename T>
759
+ void Unserialize (Stream& is, prevector<N, T>& v)
799
760
{
800
- Unserialize_impl (is, v, T ());
761
+ if constexpr (std::is_same_v<T, unsigned char >) {
762
+ // Limit size per read so bogus size value won't cause out of memory
763
+ v.clear ();
764
+ unsigned int nSize = ReadCompactSize (is);
765
+ unsigned int i = 0 ;
766
+ while (i < nSize) {
767
+ unsigned int blk = std::min (nSize - i, (unsigned int )(1 + 4999999 / sizeof (T)));
768
+ v.resize_uninitialized (i + blk);
769
+ is.read (AsWritableBytes (Span{&v[i], blk}));
770
+ i += blk;
771
+ }
772
+ } else {
773
+ Unserialize (is, Using<VectorFormatter<DefaultFormatter>>(v));
774
+ }
801
775
}
802
776
803
777
804
-
805
778
/* *
806
779
* vector
807
780
*/
808
- template <typename Stream, typename T, typename A>
809
- void Serialize_impl (Stream& os, const std::vector<T, A>& v, const unsigned char & )
810
- {
811
- WriteCompactSize (os, v. size ());
812
- if (!v. empty ())
813
- os. write ( MakeByteSpan (v));
814
- }
815
-
816
- template < typename Stream, typename T, typename A>
817
- void Serialize_impl (Stream& os, const std::vector<T, A>& v, const bool &)
818
- {
819
- // A special case for std::vector<bool>, as dereferencing
820
- // std::vector<bool>::const_iterator does not result in a const bool&
821
- // due to std::vector's special casing for bool arguments.
822
- WriteCompactSize (os, v. size ());
823
- for ( bool elem : v) {
824
- :: Serialize (os, elem );
781
+ template <typename Stream, typename T, typename A>
782
+ void Serialize (Stream& os, const std::vector<T, A>& v)
783
+ {
784
+ if constexpr (std::is_same_v<T, unsigned char >) {
785
+ WriteCompactSize (os, v. size ());
786
+ if (!v. empty ())
787
+ os. write ( MakeByteSpan (v));
788
+ } else if constexpr (std::is_same_v<T, bool >) {
789
+ // A special case for std::vector<bool>, as dereferencing
790
+ // std::vector<bool>::const_iterator does not result in a const bool&
791
+ // due to std::vector's special casing for bool arguments.
792
+ WriteCompactSize (os, v. size ());
793
+ for ( bool elem : v) {
794
+ ::Serialize (os, elem);
795
+ }
796
+ } else {
797
+ Serialize (os, Using<VectorFormatter<DefaultFormatter>>(v) );
825
798
}
826
799
}
827
800
828
- template <typename Stream, typename T, typename A, typename V>
829
- void Serialize_impl (Stream& os, const std::vector<T, A>& v, const V&)
830
- {
831
- Serialize (os, Using<VectorFormatter<DefaultFormatter>>(v));
832
- }
833
801
834
- template <typename Stream, typename T, typename A>
835
- inline void Serialize (Stream& os, const std::vector<T, A>& v)
802
+ template <typename Stream, typename T, typename A>
803
+ void Unserialize (Stream& is, std::vector<T, A>& v)
836
804
{
837
- Serialize_impl (os, v, T ());
838
- }
839
-
840
-
841
- template <typename Stream, typename T, typename A>
842
- void Unserialize_impl (Stream& is, std::vector<T, A>& v, const unsigned char &)
843
- {
844
- // Limit size per read so bogus size value won't cause out of memory
845
- v.clear ();
846
- unsigned int nSize = ReadCompactSize (is);
847
- unsigned int i = 0 ;
848
- while (i < nSize)
849
- {
850
- unsigned int blk = std::min (nSize - i, (unsigned int )(1 + 4999999 / sizeof (T)));
851
- v.resize (i + blk);
852
- is.read (AsWritableBytes (Span{&v[i], blk}));
853
- i += blk;
805
+ if constexpr (std::is_same_v<T, unsigned char >) {
806
+ // Limit size per read so bogus size value won't cause out of memory
807
+ v.clear ();
808
+ unsigned int nSize = ReadCompactSize (is);
809
+ unsigned int i = 0 ;
810
+ while (i < nSize) {
811
+ unsigned int blk = std::min (nSize - i, (unsigned int )(1 + 4999999 / sizeof (T)));
812
+ v.resize (i + blk);
813
+ is.read (AsWritableBytes (Span{&v[i], blk}));
814
+ i += blk;
815
+ }
816
+ } else {
817
+ Unserialize (is, Using<VectorFormatter<DefaultFormatter>>(v));
854
818
}
855
819
}
856
820
857
- template <typename Stream, typename T, typename A, typename V>
858
- void Unserialize_impl (Stream& is, std::vector<T, A>& v, const V&)
859
- {
860
- Unserialize (is, Using<VectorFormatter<DefaultFormatter>>(v));
861
- }
862
-
863
- template <typename Stream, typename T, typename A>
864
- inline void Unserialize (Stream& is, std::vector<T, A>& v)
865
- {
866
- Unserialize_impl (is, v, T ());
867
- }
868
-
869
-
870
821
871
822
/* *
872
823
* pair
@@ -1039,28 +990,16 @@ class CSizeComputer
1039
990
int GetVersion () const { return nVersion; }
1040
991
};
1041
992
1042
- template <typename Stream>
1043
- void SerializeMany (Stream& s)
1044
- {
1045
- }
1046
-
1047
- template <typename Stream, typename Arg, typename ... Args>
1048
- void SerializeMany (Stream& s, const Arg& arg, const Args&... args)
1049
- {
1050
- ::Serialize (s, arg);
1051
- ::SerializeMany (s, args...);
1052
- }
1053
-
1054
- template <typename Stream>
1055
- inline void UnserializeMany (Stream& s)
993
+ template <typename Stream, typename ... Args>
994
+ void SerializeMany (Stream& s, const Args&... args)
1056
995
{
996
+ (::Serialize (s, args), ...);
1057
997
}
1058
998
1059
- template <typename Stream, typename Arg , typename ... Args>
1060
- inline void UnserializeMany (Stream& s, Arg&& arg, Args&&... args)
999
+ template <typename Stream, typename ... Args>
1000
+ inline void UnserializeMany (Stream& s, Args&&... args)
1061
1001
{
1062
- ::Unserialize (s, arg);
1063
- ::UnserializeMany (s, args...);
1002
+ (::Unserialize (s, args), ...);
1064
1003
}
1065
1004
1066
1005
template <typename Stream, typename ... Args>
0 commit comments