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_array class.
0004 
0005  ----------------------------------------------------------------------*/
0006 
0007 #include <catch.hpp>
0008 #include "FWCore/Utilities/interface/get_underlying_safe.h"
0009 #include "FWCore/Utilities/interface/propagate_const_array.h"
0010 
0011 namespace {
0012   class ConstChecker {
0013   public:
0014     int value() { return 0; }
0015 
0016     int const value() const { return 1; }
0017   };
0018 
0019   // used to check that edm::propagate_const_array<T[]> works with incomplete types
0020   class Incomplete;
0021 
0022 }  // namespace
0023 
0024 TEST_CASE("propagate_const_array basic operations", "[propagate_const_array]") {
0025   SECTION("test propagate_const_array<T[]>") {
0026     ConstChecker checker[10];
0027     edm::propagate_const_array<ConstChecker[]> pChecker(checker);
0028 
0029     REQUIRE(0 == pChecker[1].value());
0030     REQUIRE(0 == pChecker.get()[1].value());
0031     REQUIRE(0 == get_underlying_safe(pChecker)[1].value());
0032 
0033     const edm::propagate_const_array<ConstChecker[]> pConstChecker(checker);
0034 
0035     REQUIRE(1 == pConstChecker[1].value());
0036     REQUIRE(1 == pConstChecker.get()[1].value());
0037     REQUIRE(1 == get_underlying_safe(pConstChecker)[1].value());
0038   }
0039 
0040   // test for edm::propagate_const_array<shared_ptr<T>>
0041   SECTION("test for edm::propagate_const_array<shared_ptr<T>>") {
0042     // std::make_shared<T[]> requires C++20
0043     auto checker = std::shared_ptr<ConstChecker[]>(new ConstChecker[10]);
0044     edm::propagate_const_array<std::shared_ptr<ConstChecker[]>> pChecker(checker);
0045 
0046     REQUIRE(0 == pChecker[1].value());
0047     REQUIRE(0 == pChecker.get()[1].value());
0048     REQUIRE(0 == get_underlying_safe(pChecker)[1].value());
0049 
0050     const edm::propagate_const_array<std::shared_ptr<ConstChecker[]>> pConstChecker(checker);
0051 
0052     REQUIRE(1 == pConstChecker[1].value());
0053     REQUIRE(1 == pConstChecker.get()[1].value());
0054     REQUIRE(1 == get_underlying_safe(pConstChecker)[1].value());
0055   }
0056 
0057   SECTION("test for edm::propagate_const_array<unique_ptr<T>>") {
0058     auto checker = std::make_unique<ConstChecker[]>(10);
0059     edm::propagate_const_array<std::unique_ptr<ConstChecker[]>> pChecker(std::move(checker));
0060 
0061     REQUIRE(0 == pChecker[1].value());
0062     REQUIRE(0 == pChecker.get()[1].value());
0063     REQUIRE(0 == get_underlying_safe(pChecker)[1].value());
0064 
0065     const edm::propagate_const_array<std::unique_ptr<ConstChecker[]>> pConstChecker(
0066         std::make_unique<ConstChecker[]>(10));
0067 
0068     REQUIRE(1 == pConstChecker[1].value());
0069     REQUIRE(1 == pConstChecker.get()[1].value());
0070   }
0071 
0072   SECTION("test for edm::propagate_const_array<T[]> with incomplete types") {
0073     edm::propagate_const_array<Incomplete[]> pIncomplete(nullptr);
0074 
0075     REQUIRE(nullptr == get_underlying(pIncomplete));
0076   }
0077 }