StringBuffer.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #ifndef STRINGBUFFER_H
  2. #define STRINGBUFFER_H
  3. #include <iostream>
  4. #include <cstring>
  5. template<int N>
  6. class StringBuffer final {
  7. int length;
  8. int hash;
  9. char data[N];
  10. void addToHash(char c) {
  11. hash = 257 * hash + c;
  12. }
  13. void addToHash(int from, int to) {
  14. for(int i = from; i < to; i++) {
  15. addToHash(data[i]);
  16. }
  17. }
  18. public:
  19. StringBuffer() : length(0), hash(0) {
  20. data[0] = '\0';
  21. }
  22. template<typename T>
  23. StringBuffer(const T& t) : StringBuffer() {
  24. append(t);
  25. }
  26. bool operator==(const char* str) const {
  27. return strcmp(data, str) == 0;
  28. }
  29. bool operator==(const StringBuffer& other) const {
  30. return length == other.length && other == data;
  31. }
  32. bool operator!=(const char* str) const {
  33. return !((*this) == str);
  34. }
  35. bool operator!=(const StringBuffer& other) const {
  36. return !((*this) == other);
  37. }
  38. operator const char*() const {
  39. return data;
  40. }
  41. char operator[](int index) const {
  42. return data[index];
  43. }
  44. int getLength() const {
  45. return length;
  46. }
  47. StringBuffer& append(char c) {
  48. if(length < N - 1) {
  49. data[length++] = c;
  50. addToHash(c);
  51. data[length] = '\0';
  52. }
  53. return *this;
  54. }
  55. StringBuffer& append(const char* str) {
  56. for(int i = 0; length < N - 1 && str[i] != '\0'; length++, i++) {
  57. data[length] = str[i];
  58. addToHash(str[i]);
  59. }
  60. data[length] = '\0';
  61. return *this;
  62. }
  63. template<typename T>
  64. StringBuffer& append(const char* format, const T& t) {
  65. int left = N - length;
  66. int written = snprintf(data + length, left, format, t);
  67. int oldLength = length;
  68. if(written < left) {
  69. length += written;
  70. } else {
  71. length = N - 1;
  72. }
  73. addToHash(oldLength, length);
  74. return *this;
  75. }
  76. StringBuffer& append(int i) {
  77. return append("%d", i);
  78. }
  79. StringBuffer& append(float i) {
  80. return append("%.2f", i);
  81. }
  82. StringBuffer& append(bool b) {
  83. return b ? append("true") : append("false");
  84. }
  85. template<typename T>
  86. StringBuffer& append(const T& t) {
  87. t.toString(*this);
  88. return *this;
  89. }
  90. StringBuffer& clear() {
  91. length = 0;
  92. hash = 0;
  93. data[0] = '\0';
  94. return *this;
  95. }
  96. int hashCode() const {
  97. return hash;
  98. }
  99. void print() {
  100. std::cout << data;
  101. }
  102. };
  103. template<int N>
  104. bool operator==(const char* str, const StringBuffer<N> buffer) {
  105. return buffer == str;
  106. }
  107. template<int N>
  108. bool operator!=(const char* str, const StringBuffer<N> buffer) {
  109. return buffer != str;
  110. }
  111. #endif