/*
String const hello("hello");
String const hell = hello[0][4]; // теперь в hell хранится подстрока "hell"
String const ell = hello[1][4]; // теперь в ell хранится подстрока "ell"
Обратите внимание, что i может равняться j, в этом случае результатом должна быть пустая строка. Гарантируется,
что i никогда не будет больше j, и они не будут выходить за пределы длины строки.
Требования к реализации: При выполнении задания вы можете создавать любые методы/конструкторы или даже структуры/классы,
если они вам нужны. Реализовывать методы, которые уже объявленны в шаблоне, не нужно они уже реализованы. При выполнении
задания не вводите и не выводите что-либо. Реализовывать функцию main не нужно.
*/
#include <cstddef> // size_t
#include <cstring>
struct String {
String( const char * str = "" ) ;
String( size_t n, char c) ;
String( const String & other) ;
String & operator= ( const String & other) ;
void append( const String & other) ;
~String( ) ;
class Proxy {
public :
Proxy( char * const str) : str( str) , i( 0 ) { }
String operator[ ] ( size_t j) {
return substr( i, j) ;
}
String substr( size_t begin, size_t end) {
char * tmp = static_cast < char * > ( memcpy ( new char [ end - begin + 1 ] , & str[ begin] , sizeof ( char ) * ( end - begin) ) ) ;
tmp[ end- begin] = '\0 ' ;
return String( tmp) ;
}
Proxy& setI( size_t i) {
this- > i = i;
return * this ;
}
private :
size_t i;
char * const str;
} ;
Proxy operator[ ] ( size_t i) const {
return Proxy( str) .setI ( i) ;
}
size_t size;
char * str;
} ;
LyoKU3RyaW5nIGNvbnN0IGhlbGxvKCJoZWxsbyIpOwpTdHJpbmcgY29uc3QgaGVsbCA9IGhlbGxvWzBdWzRdOyAvLyDRgtC10L/QtdGA0Ywg0LIgaGVsbCDRhdGA0LDQvdC40YLRgdGPINC/0L7QtNGB0YLRgNC+0LrQsCAiaGVsbCIKU3RyaW5nIGNvbnN0IGVsbCAgPSBoZWxsb1sxXVs0XTsgLy8g0YLQtdC/0LXRgNGMINCyIGVsbCDRhdGA0LDQvdC40YLRgdGPINC/0L7QtNGB0YLRgNC+0LrQsCAiZWxsIgoKCtCe0LHRgNCw0YLQuNGC0LUg0LLQvdC40LzQsNC90LjQtSwg0YfRgtC+IGkg0LzQvtC20LXRgiDRgNCw0LLQvdGP0YLRjNGB0Y8gaiwg0LIg0Y3RgtC+0Lwg0YHQu9GD0YfQsNC1INGA0LXQt9GD0LvRjNGC0LDRgtC+0Lwg0LTQvtC70LbQvdCwINCx0YvRgtGMINC/0YPRgdGC0LDRjyDRgdGC0YDQvtC60LAuINCT0LDRgNCw0L3RgtC40YDRg9C10YLRgdGPLArRh9GC0L4gaSDQvdC40LrQvtCz0LTQsCDQvdC1INCx0YPQtNC10YIg0LHQvtC70YzRiNC1IGosINC4INC+0L3QuCDQvdC1INCx0YPQtNGD0YIg0LLRi9GF0L7QtNC40YLRjCDQt9CwINC/0YDQtdC00LXQu9GLINC00LvQuNC90Ysg0YHRgtGA0L7QutC4LgoK0KLRgNC10LHQvtCy0LDQvdC40Y8g0Log0YDQtdCw0LvQuNC30LDRhtC40Lg6INCf0YDQuCDQstGL0L/QvtC70L3QtdC90LjQuCDQt9Cw0LTQsNC90LjRjyDQstGLINC80L7QttC10YLQtSDRgdC+0LfQtNCw0LLQsNGC0Ywg0LvRjtCx0YvQtSDQvNC10YLQvtC00Ysv0LrQvtC90YHRgtGA0YPQutGC0L7RgNGLINC40LvQuCDQtNCw0LbQtSDRgdGC0YDRg9C60YLRg9GA0Ysv0LrQu9Cw0YHRgdGLLArQtdGB0LvQuCDQvtC90Lgg0LLQsNC8INC90YPQttC90YsuINCg0LXQsNC70LjQt9C+0LLRi9Cy0LDRgtGMINC80LXRgtC+0LTRiywg0LrQvtGC0L7RgNGL0LUg0YPQttC1INC+0LHRitGP0LLQu9C10L3QvdGLINCyINGI0LDQsdC70L7QvdC1LCDQvdC1INC90YPQttC90L4gINC+0L3QuCDRg9C20LUg0YDQtdCw0LvQuNC30L7QstCw0L3Riy4g0J/RgNC4INCy0YvQv9C+0LvQvdC10L3QuNC4CtC30LDQtNCw0L3QuNGPINC90LUg0LLQstC+0LTQuNGC0LUg0Lgg0L3QtSDQstGL0LLQvtC00LjRgtC1INGH0YLQvi3Qu9C40LHQvi4g0KDQtdCw0LvQuNC30L7QstGL0LLQsNGC0Ywg0YTRg9C90LrRhtC40Y4gbWFpbiDQvdC1INC90YPQttC90L4uCiovCgojaW5jbHVkZSA8Y3N0ZGRlZj4gLy8gc2l6ZV90CiNpbmNsdWRlIDxjc3RyaW5nPgoKc3RydWN0IFN0cmluZyB7CglTdHJpbmcoY29uc3QgY2hhciAqc3RyID0gIiIpOwoJU3RyaW5nKHNpemVfdCBuLCBjaGFyIGMpOwoKICAgIFN0cmluZyhjb25zdCBTdHJpbmcgJm90aGVyKTsKICAgIFN0cmluZyAmb3BlcmF0b3I9KGNvbnN0IFN0cmluZyAmb3RoZXIpOwoKCXZvaWQgYXBwZW5kKGNvbnN0IFN0cmluZyAmb3RoZXIpOwogICAgflN0cmluZygpOwoKCWNsYXNzIFByb3h5IHsKCXB1YmxpYzoKCQlQcm94eShjaGFyKiBjb25zdCBzdHIpOnN0cihzdHIpLCBpKDApIHsJCX0KCgkJU3RyaW5nIG9wZXJhdG9yW10oc2l6ZV90IGopewoJCQlyZXR1cm4gc3Vic3RyKGksIGopOyAKCQl9CgoJCVN0cmluZyBzdWJzdHIoc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kKSB7CgkJCWNoYXIqIHRtcCA9IHN0YXRpY19jYXN0PGNoYXIqPihtZW1jcHkobmV3IGNoYXJbZW5kIC0gYmVnaW4gKyAxXSwgJnN0cltiZWdpbl0sIHNpemVvZihjaGFyKSAqIChlbmQgLSBiZWdpbikpKTsKICAgICAgICAgICAgdG1wW2VuZC1iZWdpbl0gPSAnXDAnOwoJCQlyZXR1cm4gU3RyaW5nKHRtcCk7CQoJCX0KCgkJUHJveHkmIHNldEkoc2l6ZV90IGkpIHsKCQkJdGhpcy0+aSA9IGk7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJcHJpdmF0ZToKCQlzaXplX3QgaTsKCQljaGFyKiBjb25zdCBzdHI7Cgl9OwoKCVByb3h5IG9wZXJhdG9yW10gKHNpemVfdCBpKSBjb25zdCB7CgkJcmV0dXJuIFByb3h5KHN0cikuc2V0SShpKTsgCgl9CiAgICAKCXNpemVfdCBzaXplOwoJY2hhciAqc3RyOwp9Ow==