📄 ptypes.h
字号:
/* * * C++ Portable Types Library (PTypes) * Version 2.0.2 Released 17-May-2004 * * Copyright (C) 2001-2004 Hovik Melikyan * * http://www.melikyan.com/ptypes/ * */#ifndef __PTYPES_H__#define __PTYPES_H__#ifndef __PPORT_H__#include "pport.h"#endif#include <string.h>PTYPES_BEGIN#ifdef _MSC_VER#pragma pack(push, 4)// disable "non dll-interface class '...' used as base for dll-interface class '...'" warning#pragma warning(disable : 4275)// disable "conditional expression constant" warning#pragma warning(push)#pragma warning(disable : 4127)#endifptpublic int __PFASTCALL pincrement(int* target);ptpublic int __PFASTCALL pdecrement(int* target);ptpublic int __PFASTCALL pexchange(int* target, int value);ptpublic void* __PFASTCALL pexchange(void** target, void* value);template <class T> inline T* tpexchange(T** target, T* value) { return (T*)pexchange((void**)target, (void*)value); }#if (__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)# define VARIANT_TYPECAST_HACK#endif// -------------------------------------------------------------------- //// --- string class --------------------------------------------------- //// -------------------------------------------------------------------- //// dynamic string class with thread-safe ref-counted bufferstruct _strrec { int refcount; int length;};typedef _strrec* _pstrrec;#define STR_BASE(x) (_pstrrec(x)-1)#define STR_REFCOUNT(x) (STR_BASE(x)->refcount)#define STR_LENGTH(x) (STR_BASE(x)->length)#define PTR_TO_PSTRING(p) (pstring(&(p)))#define PTR_TO_STRING(p) (*PTR_TO_PSTRING(p))ptpublic extern char* emptystr;class ptpublic string { friend class variant;protected: char* data; static void idxerror(); void _alloc(int); void _realloc(int); void _free(); void initialize() { data = emptystr; } void initialize(const char*, int); void initialize(const char*); void initialize(char); void initialize(const string& s); void initialize(const char*, int, const char*, int); void initialize(const variant&); void finalize(); void assign(const char*, int); void assign(const char*); void assign(const string&); void assign(char);#ifdef CHECK_BOUNDS void idx(int index) const { if (unsigned(index) >= unsigned(STR_LENGTH(data))) idxerror(); }#else void idx(int) const { }#endif string(const char* s1, int len1, const char* s2, int len2) { initialize(s1, len1, s2, len2); }public: friend int length(const string& s); friend int refcount(const string& s); friend void assign(string& s, const char* buf, int len); friend void clear(string& s); friend bool isempty(const string& s); ptpublic friend char* ptdecl setlength(string&, int); ptpublic friend char* ptdecl unique(string&); ptpublic friend void ptdecl concat(string& s, const char* sc, int catlen); ptpublic friend void ptdecl concat(string& s, const char* s1); ptpublic friend void ptdecl concat(string& s, char s1); ptpublic friend void ptdecl concat(string& s, const string& s1); ptpublic friend string ptdecl copy(const string& s, int from, int cnt); ptpublic friend string ptdecl copy(const string& s, int from); ptpublic friend void ptdecl ins(const char* s1, int s1len, string& s, int at); ptpublic friend void ptdecl ins(const char* s1, string& s, int at); ptpublic friend void ptdecl ins(char s1, string& s, int at); ptpublic friend void ptdecl ins(const string& s1, string& s, int at); ptpublic friend void ptdecl del(string& s, int at, int cnt); ptpublic friend void ptdecl del(string& s, int at); ptpublic friend int ptdecl pos(const char* s1, const string& s); ptpublic friend int ptdecl pos(char s1, const string& s); friend int pos(const string& s1, const string& s); ptpublic friend int ptdecl rpos(char s1, const string& s); ptpublic friend bool ptdecl contains(const char* s1, int len, const string& s, int at); ptpublic friend bool ptdecl contains(const char* s1, const string& s, int at); ptpublic friend bool ptdecl contains(char s1, const string& s, int at); ptpublic friend bool ptdecl contains(const string& s1, const string& s, int at); ptpublic friend string ptdecl dup(const string& s); string() { initialize(); } string(const char* sc, int initlen) { initialize(sc, initlen); } string(const char* sc) { initialize(sc); } string(char c) { initialize(c); } string(const string& s) { initialize(s); } ~string() { finalize(); }#ifdef VARIANT_TYPECAST_HACK string(const variant& v) { initialize(v); }#endif string& operator= (const char* sc) { assign(sc); return *this; } string& operator= (char c) { assign(c); return *this; } string& operator= (const string& s) { assign(s); return *this; } string& operator+= (const char* sc) { concat(*this, sc); return *this; } string& operator+= (char c) { concat(*this, c); return *this; } string& operator+= (const string& s) { concat(*this, s); return *this; } string operator+ (const char* sc) const; string operator+ (char c) const; string operator+ (const string& s) const; ptpublic friend string ptdecl operator+ (const char* sc, const string& s); ptpublic friend string ptdecl operator+ (char c, const string& s); bool operator== (const char* sc) const { return strcmp(data, sc) == 0; } bool operator== (char) const; bool operator== (const string&) const; bool operator!= (const char* sc) const { return !(*this == sc); } bool operator!= (char c) const { return !(*this == c); } bool operator!= (const string& s) const { return !(*this == s); } friend bool operator== (const char*, const string&); friend bool operator== (char, const string&); friend bool operator!= (const char*, const string&); friend bool operator!= (char, const string&); operator const char*() const { return data; } operator const uchar*() const { return (uchar*)data; } char& operator[] (int i) { idx(i); return unique(*this)[i]; } const char& operator[] (int i) const { idx(i); return data[i]; } friend void initialize(string& s); friend void initialize(string& s, const string& s1); friend void initialize(string& s, const char* s1); friend void finalize(string& s);};typedef string* pstring;inline int length(const string& s) { return STR_LENGTH(s.data); }inline int refcount(const string& s) { return STR_REFCOUNT(s.data); }inline void assign(string& s, const char* buf, int len) { s.assign(buf, len); }inline void clear(string& s) { s.finalize(); }inline bool isempty(const string& s) { return length(s) == 0; }inline int pos(const string& s1, const string& s) { return pos(s1.data, s); }inline bool operator== (const char* sc, const string& s){ return s == sc; }inline bool operator== (char c, const string& s) { return s == c; }inline bool operator!= (const char* sc, const string& s){ return s != sc; }inline bool operator!= (char c, const string& s) { return s != c; }inline void initialize(string& s) { s.initialize(); }inline void initialize(string& s, const string& s1) { s.initialize(s1); }inline void initialize(string& s, const char* s1) { s.initialize(s1); }inline void finalize(string& s) { s.finalize(); }ptpublic extern int stralloc;ptpublic extern string nullstring;// -------------------------------------------------------------------- //// --- string utilities ----------------------------------------------- //// -------------------------------------------------------------------- //ptpublic string ptdecl fill(int width, char pad);ptpublic string ptdecl pad(const string& s, int width, char c, bool left = true);ptpublic string ptdecl itostring(large value, int base, int width = 0, char pad = 0);ptpublic string ptdecl itostring(ularge value, int base, int width = 0, char pad = 0);ptpublic string ptdecl itostring(int value, int base, int width = 0, char pad = 0);ptpublic string ptdecl itostring(unsigned value, int base, int width = 0, char pad = 0);ptpublic string ptdecl itostring(large v);ptpublic string ptdecl itostring(ularge v);ptpublic string ptdecl itostring(int v);ptpublic string ptdecl itostring(unsigned v);ptpublic large ptdecl stringtoi(const char*);ptpublic large ptdecl stringtoie(const char*);ptpublic ularge ptdecl stringtoue(const char*, int base);ptpublic string ptdecl lowercase(const char* s);ptpublic string ptdecl lowercase(const string& s);char hex4(char c);inline char locase(char c) { if (c >= 'A' && c <= 'Z') return char(c + 32); return c; }inline char upcase(char c) { if (c >= 'a' && c <= 'z') return char(c - 32); return c; }inline int hstrlen(const char* p) // some Unix systems do not accept NULL { return p == nil ? 0 : (int)strlen(p); }// -------------------------------------------------------------------- //// --- character set -------------------------------------------------- //// -------------------------------------------------------------------- //const int _csetbits = 256;const int _csetbytes = _csetbits / 8;const int _csetwords = _csetbytes / sizeof(int);const char _csetesc = '~';class ptpublic cset {protected: char data[_csetbytes]; void assign(const cset& s) { memcpy(data, s.data, _csetbytes); } void assign(const char* setinit); void clear() { memset(data, 0, _csetbytes); } void fill() { memset(data, -1, _csetbytes); } void include(char b) { data[uchar(b) / 8] |= uchar(1 << (uchar(b) % 8)); } void include(char min, char max); void exclude(char b) { data[uchar(b) / 8] &= uchar(~(1 << (uchar(b) % 8))); } void unite(const cset& s); void subtract(const cset& s); void intersect(const cset& s); void invert(); bool contains(char b) const { return (data[uchar(b) / 8] & (1 << (uchar(b) % 8))) != 0; } bool eq(const cset& s) const { return memcmp(data, s.data, _csetbytes) == 0; } bool le(const cset& s) const;public: cset() { clear(); } cset(const cset& s) { assign(s); } cset(const char* setinit) { assign(setinit); } cset& operator= (const cset& s) { assign(s); return *this; } cset& operator+= (const cset& s) { unite(s); return *this; } cset& operator+= (char b) { include(b); return *this; } cset operator+ (const cset& s) const { cset t = *this; return t += s; } cset operator+ (char b) const { cset t = *this; return t += b; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -