Skip to content

Latest commit

 

History

History
136 lines (115 loc) · 3.36 KB

44_exercises.md

File metadata and controls

136 lines (115 loc) · 3.36 KB

< Back

44. Concepts

Exercise 440

Rewrite the operator equals in Position.hpp to use the concepts instead.

template<typename T>
constexpr bool operator==(const BasicPosition<T> & a, const BasicPosition<T> & b) {
  return a.x == b.x && a.y == b.y;
}

template<>
constexpr bool operator==(const BasicPosition<double> & a, const BasicPosition<double> & b) {
  constexpr double epsilon = std::numeric_limits<double>::epsilon();
  return std::abs(a.x - b.x) <= epsilon &&
         std::abs(a.y - b.y) <= epsilon;
}
Solution
template<integral T>
constexpr bool operator==(const BasicPosition<T> & a, const BasicPosition<T> & b) {
    return a.x == b.x && a.y == b.y;
}

template<floating_point T>
bool operator==(const BasicPosition<T> & a, const BasicPosition<T> & b) {
    constexpr double epsilon = std::numeric_limits<T>::epsilon();
    return std::abs(a.x - b.x) <= epsilon &&
           std::abs(a.y - b.y) <= epsilon;
}

inline bool isSamePosition(const GridPosition & a, const GridPosition & b) {
  return a == b;
}

inline bool isSamePosition(const Position & a, const Position & b) {
  return a == b;
}

Reason about conjunction

In the CHECKs replace the ReturnValue::Wrong with the value returned by the process function you think will be called.

  {
    auto red_circle = circle<color::red>{};
    CHECK(process(red_circle) == ReturnValue::Wrong);
  }
  {
    auto green_circle = circle<color::green>{};
    CHECK(process(green_circle) == ReturnValue::Wrong);
  }
  {
    auto blue_circle = circle<color::blue>{};
    CHECK(process(blue_circle) == ReturnValue::Wrong);
  }
  {
    auto red_square = square<color::red>{};
    CHECK(process(red_square) == ReturnValue::Wrong);
  }
  {
    auto purple_square = square<color::purple>{};
    CHECK(process(purple_square) == ReturnValue::Wrong);
  }
  {
    auto red_triangle = triangle<color::red>{};
    CHECK(process(red_triangle) == ReturnValue::Wrong);
  }
  {
    auto blue_triangle = triangle<color::blue>{};
    CHECK(process(blue_triangle) == ReturnValue::Wrong);
  }
Hint: Picture of the relationships Hint
Solution
TEST_CASE("Exercise 441 : Reason about conjunction", "[44]") {
  {
    auto red_circle = circle<color::red>{};
    CHECK(process(red_circle) == ReturnValue::Fourth);
  }
  {
    auto green_circle = circle<color::green>{};
    CHECK(process(green_circle) == ReturnValue::Second);
  }
  {
    auto blue_circle = circle<color::blue>{};
    CHECK(process(blue_circle) == ReturnValue::Second);
  }
  {
    auto red_square = square<color::red>{};
    CHECK(process(red_square) == ReturnValue::Third);
  }
  {
    auto purple_square = square<color::purple>{};
    CHECK(process(purple_square) == ReturnValue::First);
  }
  {
    auto red_triangle = triangle<color::red>{};
    CHECK(process(red_triangle) == ReturnValue::Third);
  }
  {
    auto blue_triangle = triangle<color::blue>{};
    CHECK(process(blue_triangle) == ReturnValue::First);
  }
}