enum_indexed_array-inl.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #pragma once
  2. #ifndef ENUM_INDEXED_ARRAY_INL_H_
  3. #error "Direct inclusion of this file is not allowed, include enum.h"
  4. // For the sake of sane code completion.
  5. #include "enum_indexed_array.h"
  6. #endif
  7. #include <library/cpp/yt/assert/assert.h>
  8. namespace NYT {
  9. ////////////////////////////////////////////////////////////////////////////////
  10. template <class E, class T, E Min, E Max>
  11. TEnumIndexedArray<E, T, Min, Max>::TEnumIndexedArray(std::initializer_list<std::pair<E, T>> elements)
  12. {
  13. for (const auto& [index, value] : elements) {
  14. (*this)[index] = value;
  15. }
  16. }
  17. template <class E, class T, E Min, E Max>
  18. T& TEnumIndexedArray<E, T, Min, Max>::operator[] (E index)
  19. {
  20. YT_ASSERT(IsValidIndex(index));
  21. return Items_[ToUnderlying(index) - ToUnderlying(Min)];
  22. }
  23. template <class E, class T, E Min, E Max>
  24. const T& TEnumIndexedArray<E, T, Min, Max>::operator[] (E index) const
  25. {
  26. return const_cast<TEnumIndexedArray&>(*this)[index];
  27. }
  28. template <class E, class T, E Min, E Max>
  29. T* TEnumIndexedArray<E, T, Min, Max>::begin()
  30. {
  31. return Items_.data();
  32. }
  33. template <class E, class T, E Min, E Max>
  34. const T* TEnumIndexedArray<E, T, Min, Max>::begin() const
  35. {
  36. return Items_.data();
  37. }
  38. template <class E, class T, E Min, E Max>
  39. T* TEnumIndexedArray<E, T, Min, Max>::end()
  40. {
  41. return begin() + Size;
  42. }
  43. template <class E, class T, E Min, E Max>
  44. const T* TEnumIndexedArray<E, T, Min, Max>::end() const
  45. {
  46. return begin() + Size;
  47. }
  48. template <class E, class T, E Min, E Max>
  49. constexpr size_t TEnumIndexedArray<E, T, Min, Max>::size() const
  50. {
  51. return Size;
  52. }
  53. template <class E, class T, E Min, E Max>
  54. bool TEnumIndexedArray<E, T, Min, Max>::IsValidIndex(E index)
  55. {
  56. return index >= Min && index <= Max;
  57. }
  58. ////////////////////////////////////////////////////////////////////////////////
  59. } // namespace NYT