mkql_block_agg_state_helper.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #pragma once
  2. #include <util/system/unaligned_mem.h>
  3. namespace NKikimr {
  4. namespace NMiniKQL {
  5. template <typename T, bool IsConst = std::is_const_v<T>>
  6. class TStateWrapper;
  7. template <typename T>
  8. class TStateWrapper<T, true> {
  9. public:
  10. TStateWrapper(const void* ptr)
  11. : State_(ReadUnaligned<typename std::remove_const<T>::type>(ptr))
  12. { }
  13. T* Get() {
  14. return &State_;
  15. }
  16. T* operator->() {
  17. return Get();
  18. }
  19. private:
  20. T State_;
  21. };
  22. template <typename T>
  23. class TStateWrapper<T, false> {
  24. public:
  25. TStateWrapper(void* ptr)
  26. : State_(ReadUnaligned<T>(ptr))
  27. , Ptr_(ptr)
  28. { }
  29. ~TStateWrapper() {
  30. WriteUnaligned<T>(Ptr_, State_);
  31. }
  32. T* Get() {
  33. return &State_;
  34. }
  35. T* operator->() {
  36. return Get();
  37. }
  38. private:
  39. T State_;
  40. void* Ptr_;
  41. };
  42. template <typename T>
  43. inline TStateWrapper<T> MakeStateWrapper(void* ptr) {
  44. return TStateWrapper<T>(ptr);
  45. }
  46. template <typename T>
  47. inline TStateWrapper<const T> MakeStateWrapper(const void* ptr) {
  48. return TStateWrapper<const T>(ptr);
  49. }
  50. template<typename T>
  51. inline T Cast(T t) {
  52. return t;
  53. }
  54. inline NYql::NDecimal::TDecimal Cast(const std::shared_ptr<arrow::Buffer>& buffer) {
  55. return *reinterpret_cast<const NYql::NDecimal::TDecimal*>(buffer->data());
  56. }
  57. }
  58. }