istringstream_nocopy: Implement in a standards-compliant way
Fixes #1135.
This commit is contained in:
		
							parent
							
								
									3f4d3f8a1a
								
							
						
					
					
						commit
						0d2ebb4373
					
				
					 1 changed files with 40 additions and 4 deletions
				
			
		|  | @ -435,14 +435,50 @@ void callSuccess( | ||||||
|    argument. This is useful for large strings. The caller must ensure |    argument. This is useful for large strings. The caller must ensure | ||||||
|    that the string object is not destroyed while it's referenced by |    that the string object is not destroyed while it's referenced by | ||||||
|    this object. */ |    this object. */ | ||||||
| struct istringstream_nocopy : public std::stringstream | class istringbuf_nocopy : public std::streambuf | ||||||
| { | { | ||||||
|     istringstream_nocopy(const std::string & s) |     const std::string & s; | ||||||
|  |     std::streamsize off; | ||||||
|  | public: | ||||||
|  |     istringbuf_nocopy(const std::string & s) : s{s}, off{0} | ||||||
|     { |     { | ||||||
|         rdbuf()->pubsetbuf( |     } | ||||||
|             (char *) s.data(), s.size()); | 
 | ||||||
|  | private: | ||||||
|  |     int_type underflow() | ||||||
|  |     { | ||||||
|  |       if (off == s.size()) | ||||||
|  |           return traits_type::eof(); | ||||||
|  |       return traits_type::to_int_type(s[off]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     int_type uflow() | ||||||
|  |     { | ||||||
|  |         if (off == s.size()) | ||||||
|  |             return traits_type::eof(); | ||||||
|  |         return traits_type::to_int_type(s[off++]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     int_type pbackfail(int_type ch) | ||||||
|  |     { | ||||||
|  |         if (off == 0 || (ch != traits_type::eof() && ch != s[off - 1])) | ||||||
|  |             return traits_type::eof(); | ||||||
|  | 
 | ||||||
|  |         return traits_type::to_int_type(s[--off]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     std::streamsize showmanyc() | ||||||
|  |     { | ||||||
|  |         return s.size() - off; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | struct istringstream_nocopy : public std::istream | ||||||
|  | { | ||||||
|  |     istringbuf_nocopy buf; | ||||||
|  |     istringstream_nocopy(const std::string & s) : std::istream(&buf), buf(s) {}; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue