StringBuffer.h 2.7 KB

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