#include <stdexcept>
#include <iostream>
template < typename T>
struct fibonacci_sequence
{
using value_type = T;
value_type operator( ) ( )
{
if ( next < current)
throw std:: overflow_error ( "Overflow encountered in fibonacci_sequence." ) ;
auto result = current;
auto next_in_series = current + next;
current = next;
next = next_in_series;
return result;
}
private :
value_type current = 0 ;
value_type next = 1 ;
} ;
template < typename sequence>
void largest_generated( sequence& seq)
{
typename sequence:: value_type largest = 0 ;
try {
for ( ;; )
largest = seq( ) ;
}
catch ( std:: exception & ex)
{
std:: cout << ex.what ( ) << '\n ' ;
std:: cout << "Last value generated was " << largest << "\n \n " ;
}
}
int main( )
{
fibonacci_sequence< int > int_seq;
fibonacci_sequence< unsigned > unsigned_seq;
fibonacci_sequence< unsigned long long > ull_seq;
largest_generated( int_seq) ;
largest_generated( unsigned_seq) ;
largest_generated( ull_seq) ;
}
I2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBmaWJvbmFjY2lfc2VxdWVuY2UKewogICAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CgogICAgdmFsdWVfdHlwZSBvcGVyYXRvcigpKCkKICAgIHsKICAgICAgICBpZiAobmV4dCA8IGN1cnJlbnQpCiAgICAgICAgICAgIHRocm93IHN0ZDo6b3ZlcmZsb3dfZXJyb3IoIk92ZXJmbG93IGVuY291bnRlcmVkIGluIGZpYm9uYWNjaV9zZXF1ZW5jZS4iKTsKCiAgICAgICAgYXV0byByZXN1bHQgPSBjdXJyZW50OwoKICAgICAgICBhdXRvIG5leHRfaW5fc2VyaWVzID0gY3VycmVudCArIG5leHQ7CiAgICAgICAgY3VycmVudCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHRfaW5fc2VyaWVzOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKCnByaXZhdGU6CiAgICB2YWx1ZV90eXBlIGN1cnJlbnQgPSAwOwogICAgdmFsdWVfdHlwZSBuZXh0ID0gMTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBzZXF1ZW5jZT4Kdm9pZCBsYXJnZXN0X2dlbmVyYXRlZChzZXF1ZW5jZSYgc2VxKQp7CiAgICB0eXBlbmFtZSBzZXF1ZW5jZTo6dmFsdWVfdHlwZSBsYXJnZXN0ID0gMDsKCiAgICB0cnkgewogICAgICAgIGZvciAoOzspCiAgICAgICAgICAgIGxhcmdlc3QgPSBzZXEoKTsKICAgIH0KCiAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGV4KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBleC53aGF0KCkgPDwgJ1xuJzsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkxhc3QgdmFsdWUgZ2VuZXJhdGVkIHdhcyAiIDw8IGxhcmdlc3QgPDwgIlxuXG4iOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGZpYm9uYWNjaV9zZXF1ZW5jZTxpbnQ+IGludF9zZXE7CiAgICBmaWJvbmFjY2lfc2VxdWVuY2U8dW5zaWduZWQ+IHVuc2lnbmVkX3NlcTsKICAgIGZpYm9uYWNjaV9zZXF1ZW5jZTx1bnNpZ25lZCBsb25nIGxvbmc+IHVsbF9zZXE7CgogICAgbGFyZ2VzdF9nZW5lcmF0ZWQoaW50X3NlcSk7CiAgICBsYXJnZXN0X2dlbmVyYXRlZCh1bnNpZ25lZF9zZXEpOwogICAgbGFyZ2VzdF9nZW5lcmF0ZWQodWxsX3NlcSk7Cn0=