📄 strings.hpp
字号:
#ifndef _MAR_STRINGS_HPP
#define _MAR_STRINGS_HPP
/***********************************************************************
M a r c i n W u d a r c z y k 's NonameLib
Freeware library
Data Structures
ver 0.9 Beta
USE AT OWN RISK
More info you can find in file libread.txt
(c) 1999 Marcin Wudarczyk
***********************************************************************/
#include <check.hpp>
#include <_defs.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#if defined(__VCLSTRING__) || defined(__VCL__)
# include <vcl\system.hpp>
#endif
#ifdef __BCPPB__
#pragma option push
#endif
#pragma warn -sig
#ifdef __BCPPB__
namespace mar {
#endif
template<class Tw, class Tr> class smpvctri {
public:
class proplen {
friend class smpvctri;
private:
Tw s;
char *& gets() { return s; }
public:
proplen() {}
proplen(Tw s) : s(s) {}
operator word() const { return s ? strlen(s) : 0; }
word operator()() const { return me; }
} len;
#define s (len.gets())
protected:
Tw str() { return s; }
public:
smpvctri() : len(0) {}
smpvctri(Tw co) : len(co) {}
typedef Tw itr;
typedef itr iterator;
operator Tw &() const { return str(); }
};
#undef s
template<class Tw, class Tr> class datastri;
template<class Tw, class Tr> class inplacedatastri: public smpvctri<Tw, Tr> {
private:
static word line;
public:
inplacedatastri():smpvctri<Tw, Tr>() {}
inplacedatastri(Tw co):smpvctri<Tw, Tr>(co) {}
inplacedatastr(const char co,const word ile=1) {
check(s=new char[ile+1]);
memset(s,co,ile);
s[ile]=0;
}
inplacedatastri(word co) { check(s=new char[co+1]);s[co]=0;}
inplacedatastri(int co) { check(s=new char[co+1]);s[co]=0;}
inplacedatastri(byte co) { check(s=new char[co+1]);s[co]=0;}
inplacedatastri(dword co) { check(s=new char[co+1]);s[co]=0;}
inplacedatastri(long co) { check(s=new char[co+1]);s[co]=0;}
inplacedatastri &swap(inplacedatastri &co) {
Tw *p=co.s;
co.s=s;
s=p;
return me;
}
inplacedatastri insert (word w,const inplacedatastri &co,word odkad,word ile) const {
inplacedatastri out(word(ile+len()-odkad));
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
return out;
}
inplacedatastri &insert_(word w,const inplacedatastri &co,word odkad,word ile) {
inplacedatastri out=(word)(ile+len()-odkad);
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
swap(out);
return *this;
}
inplacedatastri mid(word start,word ile) const {
inplacedatastri out=ile;
memcpy(out,s+start,ile);
return out;
}
inplacedatastri &mid_(word start,word ile) {
inplacedatastri out=ile;
memcpy(out,s+start,ile);
swap(out);
return *this;
}
inplacedatastri get(word skad,word dokad) const {
if (skad>dokad || !len()) return inplacedatastri();
inplacedatastri out=word(dokad-skad+1);
memcpy(out,s+skad,dokad-skad+1);
return out;
}
inplacedatastri &get_(word skad,word dokad) {
if (skad>dokad) return *this=inplacedatastri();
inplacedatastri out=word(dokad-skad+1);
memcpy(out,s+skad,dokad-skad+1);
swap(out);
return *this;
}
inplacedatastri insert (word w,const inplacedatastri &co,word odkad=0) const {
word ile=co.len();
inplacedatastri out(word(ile+len()-odkad));
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
return out;
}
inplacedatastri &insert_(word w,const inplacedatastri &co,word odkad=0) {
word ile=co.len();
inplacedatastri out=(word)(ile+len()-odkad);
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
swap(out);
return *this;
}
inplacedatastri mid(word start=0) const {
word ile=len()-start;
inplacedatastri out=ile;
memcpy(out,s+start,ile);
return out;
}
inplacedatastri &mid_(word start=0) {
word ile=len()-start;
inplacedatastri out=ile;
memcpy(out,s+start,ile);
swap(out);
return *this;
}
inplacedatastri get(word skad) const {
word dokad=len();
if (skad>dokad || !len()) return inplacedatastri();
inplacedatastri out=word(dokad-skad+1);
memcpy(out,s+skad,dokad-skad+1);
return out;
}
inplacedatastri &get_(word skad) {
word dokad=len();
if (skad>dokad) return *this=inplacedatastri();
inplacedatastri out=word(dokad-skad+1);
memcpy(out,s+skad,dokad-skad+1);
swap(out);
return *this;
}
inplacedatastri left(word ile) const {
inplacedatastri out=ile;
memcpy(out,s,ile);
return out;
}
inplacedatastri &left_(word ile) {
inplacedatastri out=ile;
memcpy(out,s,ile);
swap(out);
return *this;
}
inplacedatastri right(word ile) const {
inplacedatastri out=ile;
memcpy(out,s+len()-ile,ile);
return out;
}
inplacedatastri &right_(word ile) {
inplacedatastri out=ile;
memcpy(out,s+len()-ile,ile);
swap(out);
return *this;
}
inplacedatastri leftr(word ile) const {
inplacedatastri out=word(len()-ile);
memcpy(out,s,len()-ile);
return out;
}
inplacedatastri &leftr_(word ile) {
inplacedatastri out=word(len()-ile);
memcpy(out,s,len()-ile);
swap(out);
return *this;
}
inplacedatastri rightr(word ile) const {
inplacedatastri out=word(len()-ile);
memcpy(out,s+ile,len()-ile);
return out;
}
inplacedatastri &rightr_(word ile) {
inplacedatastri out=word(len()-ile);
memcpy(out,s+ile,len()-ile);
swap(out);
return *this;
}
inplacedatastri put(word w,const inplacedatastri &co,word odkad=0,word ile=65535u) const {
if (ile==65535u) ile=len()-w<co.len()-odkad?len()-w:co.len()-odkad;
inplacedatastri out=*this;
memcpy(out+w,co+odkad,ile);
return out;
}
inplacedatastri &put_(word w,const inplacedatastri &co,word odkad=0,word ile=65535u) {
if (ile==65535u) ile=len()-w<co.len()-odkad?len()-w:co.len()-odkad;
memcpy(s+w,co+odkad,ile);
return *this;
}
inplacedatastri fill(char czym,word w=0,word ile=65535u) const {
if (ile==65535u) ile=len()-w;
inplacedatastri out=*this;
memset(out+w,czym,ile);
return out;
}
inplacedatastri &fill_(char czym,word w=0,word ile=65535u) {
if (ile==65535u) ile=len()-w;
memset(s+w,czym,ile);
return *this;
}
inplacedatastri &del(word w=0,word ile=65535u) {
if (ile==65535u) ile=len()-w;
inplacedatastri out=word(len()-ile);
memcpy(out,s,w);
memcpy(out+w,s+w+ile,len()-ile-w);
swap(out);
return *this;
}
inplacedatastri &cut(word w=0,word dokad=65535u) {
if (dokad==65535u) dokad=len();
inplacedatastri out=word(len()-dokad+w-1);
memcpy(out,s,w);
memcpy(out+w,s+dokad+1,len()-dokad+w-1);
swap(out);
return *this;
}
inplacedatastri &operator=(const inplacedatastri &co) {
/* if (&co!=this) {
delete s;
check(s=new char[co.len()+1]);
strcpy(s,co);
} */
s = co.s;
return me;
}
inplacedatastri &operator=(const char *co) {
/* delete s;
check(s=new char[strlen(co)+1]);
memcpy(s,co,strlen(co)+1);*/
s = co.s;
return me;
}
bool operator==(const inplacedatastri &co) const { return !strcmp(s,co); }
bool operator!=(const inplacedatastri &co) const { return strcmp(s,co); }
bool operator==(const char *co) const { return !strcmp(s,co); }
bool operator!=(const char *co) const { return strcmp(s,co); }
inplacedatastri operator+(const inplacedatastri &co) const {
inplacedatastri out=word(co.len()+len());
memcpy(out,s,len());
memcpy(out+len(),co,co.len());
return out;
}
inplacedatastri &operator+=(const inplacedatastri &co) {
inplacedatastri out=word(co.len()+len());
memcpy(out,s,len());
memcpy(out+len(),co,co.len());
swap(out);
return *this;
}
inplacedatastri operator-(word ile) const {
inplacedatastri out=word(len()-ile);
memcpy(out,s,len()-ile);
return out;
}
inplacedatastri &operator-=(word ile) {
inplacedatastri out=word(len()-ile);
memcpy(out,s,len()-ile);
swap(out);
return *this;
}
};
class _CLASSTYPE string {
public:
static word line;
class proplen {
private:
char *s;
public:
proplen() {}
proplen(char *s) : s(s) {}
operator word() const { return s ? strlen(s) : 0; }
word operator()() const { return me; }
char *& gets() const { return (char *)s; }
} len;
#define s len.gets()
public:
operator char*&() const { return (char*)s; }
// operator char*&() { return s; }
string() { s=0; }
string(const char *co) {
check(s=new char[strlen(co)+1]);
_fmemcpy(s,co,strlen(co)+1);
}
string(const string &co) {
check(s=new char[co.len()+1]);
_fmemcpy(s,co,co.len()+1); // bo blad w strcpy: zle kopiuje string zerowy
}
string(const char co,const word ile=1) {
check(s=new char[ile+1]);
memset(s,co,ile);
s[ile]=0;
}
string(word co) { check(s=new char[co+1]);s[co]=0;}
string(int co) { check(s=new char[co+1]);s[co]=0;}
string(byte co) { check(s=new char[co+1]);s[co]=0;}
string(dword co) { check(s=new char[co+1]);s[co]=0;}
string(long co) { check(s=new char[co+1]);s[co]=0;}
~string() { delete s; }
// word len() const { return strlen(s); }
// char *ch() const;
long val() const;
void swap(string &co) {
char *p=s;
s=co.s;
co.s=p;
}
string insert (word w,const string &co,word odkad,word ile) const {
string out(word(ile+len()-odkad));
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
return out;
}
string &insert_(word w,const string &co,word odkad,word ile) {
string out=(word)(ile+len()-odkad);
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
swap(out);
return *this;
}
string mid(word start,word ile) const {
string out=ile;
memcpy(out,s+start,ile);
return out;
}
string &mid_(word start,word ile) {
string out=ile;
memcpy(out,s+start,ile);
swap(out);
return *this;
}
string get(word skad,word dokad) const {
if (skad>dokad || !len()) return string();
string out=word(dokad-skad+1);
memcpy(out,s+skad,dokad-skad+1);
return out;
}
string &get_(word skad,word dokad) {
if (skad>dokad) return *this=string();
string out=word(dokad-skad+1);
memcpy(out,s+skad,dokad-skad+1);
swap(out);
return *this;
}
string insert (word w,const string &co,word odkad=0) const {
word ile=co.len();
string out(word(ile+len()-odkad));
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
return out;
}
string &insert_(word w,const string &co,word odkad=0) {
word ile=co.len();
string out=(word)(ile+len()-odkad);
memcpy(out,s,w);
memcpy(out+w,co+odkad,ile);
strcpy(out+w+ile,s+w);
swap(out);
return *this;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -