⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strings.hpp

📁 SecurityLib一个user-rights系统控件
💻 HPP
📖 第 1 页 / 共 2 页
字号:
#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 + -