File indexing completed on 2025-07-31 02:19:16
0001
0002
0003
0004
0005
0006
0007 #include <catch.hpp>
0008 #include <memory>
0009 #include "FWCore/Utilities/interface/get_underlying_safe.h"
0010 #include "FWCore/Utilities/interface/propagate_const.h"
0011
0012 namespace {
0013 class ConstChecker {
0014 public:
0015 int value() { return 0; }
0016
0017 int const value() const { return 1; }
0018 };
0019
0020
0021 class Incomplete;
0022
0023 }
0024 TEST_CASE("propagate_const basic operations", "[propagate_const]") {
0025 SECTION("test for edm::propagate_const<T*>") {
0026 ConstChecker checker;
0027 edm::propagate_const<ConstChecker*> pChecker(&checker);
0028
0029 REQUIRE(0 == pChecker.get()->value());
0030 REQUIRE(pChecker.get()->value() == pChecker->value());
0031 REQUIRE(pChecker.get()->value() == (*pChecker).value());
0032 REQUIRE(0 == get_underlying_safe(pChecker)->value());
0033
0034 const edm::propagate_const<ConstChecker*> pConstChecker(&checker);
0035
0036 REQUIRE(1 == pConstChecker.get()->value());
0037 REQUIRE(pConstChecker.get()->value() == pConstChecker->value());
0038 REQUIRE(pConstChecker.get()->value() == (*pConstChecker).value());
0039 REQUIRE(1 == get_underlying_safe(pConstChecker)->value());
0040 }
0041
0042 SECTION("test for edm::propagate_const<shared_ptr<T>>") {
0043 auto checker = std::make_shared<ConstChecker>();
0044 edm::propagate_const<std::shared_ptr<ConstChecker>> pChecker(checker);
0045
0046 REQUIRE(0 == pChecker.get()->value());
0047 REQUIRE(pChecker.get()->value() == pChecker->value());
0048 REQUIRE(pChecker.get()->value() == (*pChecker).value());
0049 REQUIRE(0 == get_underlying_safe(pChecker)->value());
0050
0051 const edm::propagate_const<std::shared_ptr<ConstChecker>> pConstChecker(checker);
0052
0053 REQUIRE(1 == pConstChecker.get()->value());
0054 REQUIRE(pConstChecker.get()->value() == pConstChecker->value());
0055 REQUIRE(pConstChecker.get()->value() == (*pConstChecker).value());
0056 REQUIRE(1 == get_underlying_safe(pConstChecker)->value());
0057 }
0058
0059
0060 SECTION("test for edm::propagate_const<unique_ptr<T>>") {
0061 auto checker = std::make_unique<ConstChecker>();
0062 edm::propagate_const<std::unique_ptr<ConstChecker>> pChecker(std::move(checker));
0063
0064 REQUIRE(0 == pChecker.get()->value());
0065 REQUIRE(pChecker.get()->value() == pChecker->value());
0066 REQUIRE(pChecker.get()->value() == (*pChecker).value());
0067 REQUIRE(0 == get_underlying_safe(pChecker)->value());
0068
0069 const edm::propagate_const<std::unique_ptr<ConstChecker>> pConstChecker(std::make_unique<ConstChecker>());
0070
0071 REQUIRE(1 == pConstChecker.get()->value());
0072 REQUIRE(pConstChecker.get()->value() == pConstChecker->value());
0073 REQUIRE(pConstChecker.get()->value() == (*pConstChecker).value());
0074 }
0075
0076 SECTION("test for edm::propagate_const<T*> with incomplete types") {
0077 Incomplete* ptr = nullptr;
0078 edm::propagate_const<Incomplete*> pIncomplete(ptr);
0079
0080 REQUIRE(nullptr == pIncomplete.get());
0081 }
0082 }