rtlcommon.hpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #ifndef ECLCOMMON_HPP
  2. #define ECLCOMMON_HPP
  3. #include "jiface.hpp"
  4. #include "jfile.hpp"
  5. #include "eclrtl.hpp"
  6. #include "eclhelper.hpp"
  7. //The CThorContiguousRowBuffer is the source for a readAhead call to ensure the entire row
  8. //is in a contiguous block of memory. The read() and skip() functions must be implemented
  9. class ECLRTL_API CThorContiguousRowBuffer : implements IRowDeserializerSource
  10. {
  11. public:
  12. CThorContiguousRowBuffer(ISerialStream * _in);
  13. inline void setStream(ISerialStream *_in) { in.set(_in); maxOffset = 0; readOffset = 0; }
  14. virtual const byte * peek(size32_t maxSize);
  15. virtual offset_t beginNested();
  16. virtual bool finishedNested(offset_t & len);
  17. virtual size32_t read(size32_t len, void * ptr);
  18. virtual size32_t readSize();
  19. virtual size32_t readPackedInt(void * ptr);
  20. virtual size32_t readUtf8(ARowBuilder & target, size32_t offset, size32_t fixedSize, size32_t len);
  21. virtual size32_t readVStr(ARowBuilder & target, size32_t offset, size32_t fixedSize);
  22. virtual size32_t readVUni(ARowBuilder & target, size32_t offset, size32_t fixedSize);
  23. //These shouldn't really be called since this class is meant to be used for a deserialize.
  24. //If we allowed padding/alignment fields in the input then the first function would make sense.
  25. virtual void skip(size32_t size);
  26. virtual void skipPackedInt();
  27. virtual void skipUtf8(size32_t len);
  28. virtual void skipVStr();
  29. virtual void skipVUni();
  30. inline bool eos()
  31. {
  32. return in->eos();
  33. }
  34. inline offset_t tell() const
  35. {
  36. return in->tell();
  37. }
  38. inline void clearStream()
  39. {
  40. in.clear();
  41. maxOffset = 0;
  42. readOffset = 0;
  43. }
  44. inline const byte * queryRow() { return buffer; }
  45. inline size32_t queryRowSize() { return readOffset; }
  46. inline void finishedRow()
  47. {
  48. if (readOffset)
  49. in->skip(readOffset);
  50. maxOffset = 0;
  51. readOffset = 0;
  52. }
  53. protected:
  54. size32_t sizePackedInt();
  55. size32_t sizeUtf8(size32_t len);
  56. size32_t sizeVStr();
  57. size32_t sizeVUni();
  58. void reportReadFail();
  59. private:
  60. inline void doPeek(size32_t maxSize)
  61. {
  62. buffer = static_cast<const byte *>(in->peek(maxSize, maxOffset));
  63. }
  64. void doRead(size32_t len, void * ptr);
  65. inline void ensureAccessible(size32_t required)
  66. {
  67. if (required > maxOffset)
  68. {
  69. doPeek(required);
  70. assertex(required <= maxOffset);
  71. }
  72. }
  73. protected:
  74. Linked<ISerialStream> in;
  75. const byte * buffer;
  76. size32_t maxOffset;
  77. size32_t readOffset;
  78. };
  79. #endif