Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-07-31 02:19:16

0001 /*----------------------------------------------------------------------
0002 
0003 Test program for edm::propagate_const class.
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   // used to check that edm::propagate_const<T*> works with incomplete types
0021   class Incomplete;
0022 
0023 }  // namespace
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   // test for edm::propagate_const<unique_ptr<T>>
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 }