1414
1515namespace rds2cpp {
1616
17- template <class Reader >
18- IntegerVector parse_integer_body (Reader&, std::vector< unsigned char > &);
17+ template <class Source_ >
18+ IntegerVector parse_integer_body (Source_ &);
1919
20- template <class Reader >
21- DoubleVector parse_double_body (Reader& reader, std::vector< unsigned char >& );
20+ template <class Source_ >
21+ DoubleVector parse_double_body (Source_& src );
2222
23- template <class Reader >
24- std::unique_ptr<RObject> parse_object (Reader&, std::vector< unsigned char > &, SharedParseInfo&);
23+ template <class Source_ >
24+ std::unique_ptr<RObject> parse_object (Source_ &, SharedParseInfo&);
2525
26- template <class Reader >
27- PairList parse_pairlist_body (Reader&, std::vector< unsigned char > &, const Header&, SharedParseInfo&);
26+ template <class Source_ >
27+ PairList parse_pairlist_body (Source_ &, const Header&, SharedParseInfo&);
2828
2929namespace altrep_internal {
3030
31- template <class Vector , class Reader >
32- Vector parse_numeric_compact_seq (Reader& reader, std::vector< unsigned char >& leftovers ) try {
33- auto header = parse_header (reader, leftovers );
31+ template <class Vector , class Source_ >
32+ Vector parse_numeric_compact_seq (Source_& src ) try {
33+ auto header = parse_header (src );
3434 if (header[3 ] != static_cast <unsigned char >(SEXPType::REAL)) {
3535 throw std::runtime_error (" expected compact_seq to store sequence information in doubles" );
3636 }
3737
38- auto info = parse_double_body (reader, leftovers );
38+ auto info = parse_double_body (src );
3939 const auto & ranges = info.data ;
4040 if (ranges.size () != 3 ) {
4141 throw std::runtime_error (" expected compact_seq's sequence information to be of length 3" );
@@ -49,7 +49,7 @@ Vector parse_numeric_compact_seq(Reader& reader, std::vector<unsigned char>& lef
4949 output.data [i] = start;
5050 }
5151
52- auto terminator = parse_header (reader, leftovers );
52+ auto terminator = parse_header (src );
5353 if (terminator[3 ] != 254 ) {
5454 throw std::runtime_error (" failed to terminate a compact_seq ALTREP correctly" );
5555 }
@@ -59,36 +59,36 @@ Vector parse_numeric_compact_seq(Reader& reader, std::vector<unsigned char>& lef
5959 throw traceback (" failed to parse compact numeric ALTREP" , e);
6060}
6161
62- template <class Vector , class Reader >
63- Vector parse_attribute_wrapper (Reader& reader, std::vector< unsigned char >& leftovers , SharedParseInfo& shared) try {
64- auto plist_header = parse_header (reader, leftovers );
62+ template <class Vector , class Source_ >
63+ Vector parse_attribute_wrapper (Source_& src , SharedParseInfo& shared) try {
64+ auto plist_header = parse_header (src );
6565 if (plist_header[3 ] != static_cast <unsigned char >(SEXPType::LIST)) {
6666 throw std::runtime_error (" expected pairlist in wrap_* ALTREP's payload" );
6767 }
6868
6969 // First pairlist element is a CONS cell where the first value is the wrapped integer vector.
7070
71- auto contents = parse_object (reader, leftovers , shared);
71+ auto contents = parse_object (src , shared);
7272 if (contents->type () != Vector::vector_sexp_type) {
7373 throw std::runtime_error (" incorrectly typed contents in wrap_* ALTREP's payload" );
7474 }
7575
7676 // Second cons value is the wrapping metadata, we don't care about it.
77- auto metaheader = parse_header (reader, leftovers );
77+ auto metaheader = parse_header (src );
7878 if (metaheader[3 ] != static_cast <unsigned char >(SEXPType::INT)) {
7979 throw std::runtime_error (" wrap_* ALTREP should have an integer vector for its metadata" );
8080 }
8181
82- auto metadata = parse_integer_body (reader, leftovers );
82+ auto metadata = parse_integer_body (src );
8383 if (metadata.data .size () != 2 ) {
8484 throw std::runtime_error (" wrap_* ALTREP's metadata should be a length-2 integer vector" );
8585 }
8686
8787 // Now we can finally get the attributes, which makes up the rest of the pairlist.
8888 auto coerced = static_cast <Vector*>(contents.get ());
89- auto attrheader = parse_header (reader, leftovers );
89+ auto attrheader = parse_header (src );
9090 if (attrheader[3 ] == static_cast <unsigned >(SEXPType::LIST)) {
91- parse_attributes_body (reader, leftovers , attrheader, coerced->attributes , shared);
91+ parse_attributes_body (src , attrheader, coerced->attributes , shared);
9292 } else if (attrheader[3 ] != static_cast <unsigned >(SEXPType::NILVALUE_)) {
9393 throw std::runtime_error (" wrap_* ALTREP's attributes should be a pairlist or NULL" );
9494 }
@@ -98,15 +98,15 @@ Vector parse_attribute_wrapper(Reader& reader, std::vector<unsigned char>& lefto
9898 throw traceback (" failed to parse attribute-wrapped ALTREP" , e);
9999}
100100
101- template <class Reader >
102- StringVector parse_deferred_string (Reader& reader, std::vector< unsigned char >& leftovers , SharedParseInfo& shared) try {
103- auto plist_header = parse_header (reader, leftovers );
101+ template <class Source_ >
102+ StringVector parse_deferred_string (Source_& src , SharedParseInfo& shared) try {
103+ auto plist_header = parse_header (src );
104104 if (plist_header[3 ] != static_cast <unsigned char >(SEXPType::LIST)) {
105105 throw std::runtime_error (" expected pairlist in deferred_string ALTREP's payload" );
106106 }
107107
108108 // First pairlist element is a CONS cell where the first value is the thing to be converted.
109- auto contents = parse_object (reader, leftovers , shared);
109+ auto contents = parse_object (src , shared);
110110 StringVector output;
111111
112112 if (contents->type () == SEXPType::INT){
@@ -160,18 +160,18 @@ StringVector parse_deferred_string(Reader& reader, std::vector<unsigned char>& l
160160 }
161161
162162 // Second cons value is the wrapping metadata, we don't care about it.
163- auto metaheader = parse_header (reader, leftovers );
163+ auto metaheader = parse_header (src );
164164 if (metaheader[3 ] != static_cast <unsigned char >(SEXPType::INT)) {
165165 throw std::runtime_error (" deferred_string ALTREP should have an integer vector for its metadata" );
166166 }
167167
168- auto metadata = parse_integer_body (reader, leftovers );
168+ auto metadata = parse_integer_body (src );
169169 if (metadata.data .size () != 1 ) {
170170 throw std::runtime_error (" deferred_string ALTREP's metadata should be a length-1 integer vector" );
171171 }
172172
173173 // Chomp up the null.
174- auto terminator = parse_header (reader, leftovers );
174+ auto terminator = parse_header (src );
175175 if (terminator[3 ] != static_cast <unsigned char >(SEXPType::NILVALUE_)) {
176176 throw std::runtime_error (" failed to terminate a deferred string ALTREP correctly" );
177177 }
@@ -183,14 +183,14 @@ StringVector parse_deferred_string(Reader& reader, std::vector<unsigned char>& l
183183
184184}
185185
186- template <class Reader >
187- std::unique_ptr<RObject> parse_altrep_body (Reader& reader, std::vector< unsigned char >& leftovers , SharedParseInfo& shared) try {
188- auto header = parse_header (reader, leftovers );
186+ template <class Source_ >
187+ std::unique_ptr<RObject> parse_altrep_body (Source_& src , SharedParseInfo& shared) try {
188+ auto header = parse_header (src );
189189 if (header[3 ] != static_cast <unsigned char >(SEXPType::LIST)) {
190190 throw std::runtime_error (" expected ALTREP description to be a pairlist" );
191191 }
192192
193- auto plist = parse_pairlist_body (reader, leftovers , header, shared);
193+ auto plist = parse_pairlist_body (src , header, shared);
194194 if (plist.data .size () < 1 || plist.data [0 ]->type () != SEXPType::SYM) {
195195 throw std::runtime_error (" expected type specification symbol in the ALTREP description" );
196196 }
@@ -204,11 +204,11 @@ std::unique_ptr<RObject> parse_altrep_body(Reader& reader, std::vector<unsigned
204204 const auto & symb = shared.symbols [sdx->index ];
205205
206206 if (symb.name == " wrap_integer" ) {
207- pointerize_ (altrep_internal::parse_attribute_wrapper<IntegerVector>(reader, leftovers , shared));
207+ pointerize_ (altrep_internal::parse_attribute_wrapper<IntegerVector>(src , shared));
208208 } else if (symb.name == " compact_intseq" ) {
209- pointerize_ (altrep_internal::parse_numeric_compact_seq<IntegerVector>(reader, leftovers ));
209+ pointerize_ (altrep_internal::parse_numeric_compact_seq<IntegerVector>(src ));
210210 } else if (symb.name == " deferred_string" ) {
211- pointerize_ (altrep_internal::parse_deferred_string (reader, leftovers , shared));
211+ pointerize_ (altrep_internal::parse_deferred_string (src , shared));
212212 } else {
213213 throw std::runtime_error (" unrecognized ALTREP type '" + symb.name + " '" );
214214 }
0 commit comments