------- Comment #3 from il dot basso dot buffo at gmail dot com 2009-03-16 22:21 ------- Here's a further reduction:
struct Point { int line, col; Point( int l = -1, int c = 0 ) throw() : line( l ), col( c ) {} bool operator==( const Point & p ) const throw() { return ( line == p.line && col == p.col ); } bool operator<( const Point & p ) const throw() { return ( line < p.line || ( line == p.line && col < p.col ) ); } }; class Basic_buffer { protected: void add_line( const char * const buf, const int len ); public: Basic_buffer( const Basic_buffer & b, const Point & p1, const Point & p2 ); int characters( const int line ) const throw(); int pgetc( Point & p ) const throw(); Point eof() const throw() { return Point( 0, 0 ); } bool pisvalid( const Point & p ) const throw() { return ( ( p.col >= 0 && p.col < characters( p.line ) ) || p == eof() ); } }; class Buffer : public Basic_buffer { public: bool save( Point p1 = Point(), Point p2 = Point() ) const; }; bool Buffer::save( Point p1, Point p2 ) const { if( !this->pisvalid( p1 ) ) p1 = eof(); if( !this->pisvalid( p2 ) ) p2 = eof(); for( Point p = p1; p < p2; ) { pgetc( p ); } return true; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39447