#ifndef _FIXEDSTRING_H_ #define _FIXEDSTRING_H_ #include <cassert> #include <string> #include <cstring> #include <iostream> #include <algorithm> #pragma warning (disable: 4996) //固定大小的字符串 class FixedString { public: size_t size; char buffer[256]; public: FixedString() : size(0) {} FixedString(const char* str) : size( strlen(str) ) { memcpy(buffer, str, size); } FixedString(const std::string & str) : size( str.size() ) { memcpy(buffer, str.c_str(), size); } FixedString(const FixedString& str) : size(str.size) { memcpy(buffer, str.buffer, str.size); } FixedString& operator=(const FixedString& str) { size = str.size; memcpy(buffer, str.buffer, str.size); return *this; } FixedString& operator+=(const FixedString& str) { assert(str.size + size <= 256); memcpy(buffer+size, str.buffer, str.size); size += str.size; return *this; } FixedString& operator+=(const char* str) { size_t length = strlen(str); assert(length + size <= 256); memcpy(buffer+size, str, length); size += length; return *this; } FixedString& operator+=(const std::string& str) { assert(str.size() + size <= 256); memcpy(buffer+size, str.c_str(), str.size()); size += str.size(); return *this; } const char* c_str() { assert(size<=255); buffer[size] = 0; return buffer; } std::string toString() { return std::string(buffer, size); } void toLower() { std::transform(begin(), end(), begin(), tolower); } void toUpper() { std::transform(begin(), end(), begin(), toupper); } FixedString substr(size_t pos, size_t count = std::string::npos) { assert(pos < 256); FixedString str; if ( count != std::string::npos && pos + count < 256 ) { memcpy(str.buffer, buffer+pos, count); str.size = count; } else { memcpy(str.buffer, buffer+pos, 256-pos); str.size = 256-pos; } return str; } char* begin() { assert(size>0); return buffer; } char* end() { assert(size<=256); return buffer+size; } bool startsWith(const char* str) { size_t length = strlen(str); if ( length > size ) return false; return 0 == memcmp( buffer, str, length ); } bool endsWith(const char* str) { size_t length = strlen(str); if ( length > size ) return false; return 0 == memcmp(buffer+size-length, str, length); } }; inline FixedString operator+(const FixedString &str1, const FixedString &str2) { FixedString str = str1; str += str2; return str; } inline FixedString operator+(const FixedString &str1, const std::string &str2) { FixedString str = str1; str += str2; return str; } inline FixedString operator+(const FixedString &str1, const char* str2) { FixedString str = str1; str += str2; return str; } inline std::ostream& operator<<(std::ostream& os, FixedString& str) { os << str.c_str(); return os; } #endif //_FIXEDSTRING_H_