propagate_const_helpers.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // A lightweight class, with pointer-like methods, that contains an int
  2. struct X
  3. {
  4. int i_;
  5. constexpr const int &operator*() const { return i_; }
  6. constexpr int &operator*() { return i_; }
  7. constexpr const int *get() const { return &i_; }
  8. constexpr int *get() { return &i_; }
  9. constexpr const int *operator->() const { return &i_; }
  10. constexpr int *operator->() { return &i_; }
  11. constexpr X(int i) : i_(i) {}
  12. };
  13. struct XWithImplicitIntStarConversion
  14. {
  15. int i_;
  16. constexpr const int &operator*() const { return i_; }
  17. constexpr int &operator*() { return i_; }
  18. constexpr const int *get() const { return &i_; }
  19. constexpr int *get() { return &i_; }
  20. constexpr const int *operator->() const { return &i_; }
  21. constexpr int *operator->() { return &i_; }
  22. constexpr operator int* () { return &i_; }
  23. constexpr XWithImplicitIntStarConversion(int i) : i_(i) {}
  24. };
  25. struct XWithImplicitConstIntStarConversion
  26. {
  27. int i_;
  28. constexpr const int &operator*() const { return i_; }
  29. constexpr int &operator*() { return i_; }
  30. constexpr const int *get() const { return &i_; }
  31. constexpr int *get() { return &i_; }
  32. constexpr const int *operator->() const { return &i_; }
  33. constexpr int *operator->() { return &i_; }
  34. constexpr operator const int* () const { return &i_; }
  35. constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {}
  36. };
  37. struct ExplicitX
  38. {
  39. int i_;
  40. constexpr const int &operator*() const { return i_; }
  41. constexpr int &operator*() { return i_; }
  42. constexpr const int *get() const { return &i_; }
  43. constexpr int *get() { return &i_; }
  44. constexpr const int *operator->() const { return &i_; }
  45. constexpr int *operator->() { return &i_; }
  46. constexpr explicit ExplicitX(int i) : i_(i) {}
  47. };
  48. struct MoveConstructibleFromX
  49. {
  50. int i_;
  51. constexpr const int &operator*() const { return i_; }
  52. constexpr int &operator*() { return i_; }
  53. constexpr const int *get() const { return &i_; }
  54. constexpr int *get() { return &i_; }
  55. constexpr const int *operator->() const { return &i_; }
  56. constexpr int *operator->() { return &i_; }
  57. constexpr MoveConstructibleFromX(int i) : i_(i) {}
  58. constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {}
  59. };
  60. struct ExplicitMoveConstructibleFromX
  61. {
  62. int i_;
  63. constexpr const int &operator*() const { return i_; }
  64. constexpr int &operator*() { return i_; }
  65. constexpr const int *get() const { return &i_; }
  66. constexpr int *get() { return &i_; }
  67. constexpr const int *operator->() const { return &i_; }
  68. constexpr int *operator->() { return &i_; }
  69. constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {}
  70. constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {}
  71. };
  72. struct CopyConstructibleFromX
  73. {
  74. int i_;
  75. constexpr const int &operator*() const { return i_; }
  76. constexpr int &operator*() { return i_; }
  77. constexpr const int *get() const { return &i_; }
  78. constexpr int *get() { return &i_; }
  79. constexpr const int *operator->() const { return &i_; }
  80. constexpr int *operator->() { return &i_; }
  81. constexpr CopyConstructibleFromX(int i) : i_(i) {}
  82. constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {}
  83. };
  84. struct ExplicitCopyConstructibleFromX
  85. {
  86. int i_;
  87. constexpr const int &operator*() const { return i_; }
  88. constexpr int &operator*() { return i_; }
  89. constexpr const int *get() const { return &i_; }
  90. constexpr int *get() { return &i_; }
  91. constexpr const int *operator->() const { return &i_; }
  92. constexpr int *operator->() { return &i_; }
  93. constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {}
  94. constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {}
  95. };