wire_format.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #pragma once
  2. #include "coded.h"
  3. #include <util/generic/string.h>
  4. #include <util/memory/tempbuf.h>
  5. namespace NClickHouse {
  6. class TWireFormat {
  7. public:
  8. template <typename T>
  9. static bool ReadFixed(TCodedInputStream* input, T* value);
  10. static bool ReadString(TCodedInputStream* input, TString* value);
  11. static bool ReadBytes(TCodedInputStream* input, void* buf, size_t len);
  12. static bool ReadUInt64(TCodedInputStream* input, ui64* value);
  13. template <typename T>
  14. static void WriteFixed(TCodedOutputStream* output, const T& value);
  15. static void WriteBytes(TCodedOutputStream* output, const void* buf, size_t len);
  16. static void WriteString(TCodedOutputStream* output, const TString& value);
  17. static void WriteStringBuf(TCodedOutputStream* output, const TStringBuf value);
  18. static void WriteUInt64(TCodedOutputStream* output, const ui64 value);
  19. };
  20. template <typename T>
  21. inline bool TWireFormat::ReadFixed(
  22. TCodedInputStream* input,
  23. T* value) {
  24. return input->ReadRaw(value, sizeof(T));
  25. }
  26. inline bool TWireFormat::ReadString(
  27. TCodedInputStream* input,
  28. TString* value) {
  29. ui64 len;
  30. if (input->ReadVarint64(&len)) {
  31. if (len > 0x00FFFFFFULL) {
  32. return false;
  33. }
  34. TTempBuf buf(len);
  35. if (input->ReadRaw(buf.Data(), (size_t)len)) {
  36. value->assign(buf.Data(), len);
  37. return true;
  38. }
  39. }
  40. return false;
  41. }
  42. inline bool TWireFormat::ReadBytes(
  43. TCodedInputStream* input, void* buf, size_t len) {
  44. return input->ReadRaw(buf, len);
  45. }
  46. inline bool TWireFormat::ReadUInt64(
  47. TCodedInputStream* input,
  48. ui64* value) {
  49. return input->ReadVarint64(value);
  50. }
  51. template <typename T>
  52. inline void TWireFormat::WriteFixed(
  53. TCodedOutputStream* output,
  54. const T& value) {
  55. output->WriteRaw(&value, sizeof(T));
  56. }
  57. inline void TWireFormat::WriteBytes(
  58. TCodedOutputStream* output,
  59. const void* buf,
  60. size_t len) {
  61. output->WriteRaw(buf, len);
  62. }
  63. inline void TWireFormat::WriteString(
  64. TCodedOutputStream* output,
  65. const TString& value) {
  66. output->WriteVarint64(value.size());
  67. output->WriteRaw(value.data(), value.size());
  68. }
  69. inline void TWireFormat::WriteStringBuf(
  70. TCodedOutputStream* output,
  71. const TStringBuf value) {
  72. output->WriteVarint64(value.size());
  73. output->WriteRaw(value.data(), value.size());
  74. }
  75. inline void TWireFormat::WriteUInt64(
  76. TCodedOutputStream* output,
  77. const ui64 value) {
  78. output->WriteVarint64(value);
  79. }
  80. }