diff --git a/root/io/uniquePointer/CMakeLists.txt b/root/io/uniquePointer/CMakeLists.txt index ace79827ae..cf160f64a5 100644 --- a/root/io/uniquePointer/CMakeLists.txt +++ b/root/io/uniquePointer/CMakeLists.txt @@ -65,6 +65,26 @@ ROOTTEST_ADD_TEST(simpleRead OUTREF simpleRead.ref DEPENDS simpleWriteRead) +ROOTTEST_ADD_TEST(privacy-dict + COMMAND ${ROOT_rootcling_CMD} -f privacy.dict.cc + ${CMAKE_CURRENT_SOURCE_DIR}/privacy.hh + ${CMAKE_CURRENT_SOURCE_DIR}/privacyLinkDef.h + OUTREF privacyDict.oref + ERRREF privacyDict.eref) + +ROOTTEST_GENERATE_DICTIONARY(privacy privacy.hh LINKDEF privacyLinkDef.h) + +ROOTTEST_ADD_TEST(privacy-load + MACRO privacyLoad.C + OUTREF privacyLoad.oref + ERRREF privacyLoad.eref + DEPENDS ${GENERATE_DICTIONARY_TEST}) + +ROOTTEST_ADD_TEST(privacy-interp + MACRO privacyInterp.C + OUTREF privacyInterp.oref + ERRREF privacyInterp.eref) + ROOTTEST_GENERATE_REFLEX_DICTIONARY(classes classes.h SELECTION sel.xml) ROOTTEST_ADD_TEST(simpleWriteRead diff --git a/root/io/uniquePointer/ns_privacy.hh b/root/io/uniquePointer/ns_privacy.hh new file mode 100644 index 0000000000..f20bdd5541 --- /dev/null +++ b/root/io/uniquePointer/ns_privacy.hh @@ -0,0 +1,50 @@ +#ifndef ns_privacy_hh +#define ns_privacy_hh +#include +#include +#include + +namespace fs = std::filesystem; + +namespace privacy +{ + +class test +{ +public: + test() = default; + ~test() = default;; + +private: + fs::path path; /// unique_data; + Inner *ptr_data; +}; + +class test2 { +private: + test1 transient_data; /// persistent_data; + std::tuple transient_data; /// +#include +#include + +namespace fs = std::filesystem; + +class test +{ +public: + test() = default; + ~test() = default;; + +private: + fs::path path; /// unique_data; + Inner *ptr_data; +}; + +class test2 { +private: + test1 transient_data; /// persistent_data; + std::tuple transient_data; ///GetStreamerInfo()->GetElements()) { + if (auto el = dynamic_cast(member)) { + std::cout << " " << el->GetTypeName(); + if (el->IsaPointer() && !TString(el->GetTypeName()).Contains("*")) + std::cout << "*"; + std::cout << " " << el->GetName() << '\n'; + } + } + std::cout << '\n'; + } + + return 0; +} diff --git a/root/io/uniquePointer/privacyInterp.eref b/root/io/uniquePointer/privacyInterp.eref new file mode 100644 index 0000000000..2e92ed96ca --- /dev/null +++ b/root/io/uniquePointer/privacyInterp.eref @@ -0,0 +1,7 @@ +Warning in : privacy::test: filesystem::path has no streamer or dictionary, data member "persistent_path" will not be saved +Error in : privacy::test1: privacy::test1::Inner has no streamer or dictionary, data member unique_data will not be saved +Error in : privacy::test1: privacy::test1::Inner* has no streamer or dictionary, data member ptr_data will not be saved +Warning in : privacy::test2: privacy::test1 has no streamer or dictionary, data member "persistent_data" will not be saved +Error in : Could not declare alternate type for tuple since privacy::test3::Inner (or one of its context) is private or protected +Warning in : no dictionary for class tuple is available +Warning in : privacy::test3: tuple has no streamer or dictionary, data member "persistent_data" will not be saved diff --git a/root/io/uniquePointer/privacyInterp.oref b/root/io/uniquePointer/privacyInterp.oref new file mode 100644 index 0000000000..f3c921aed3 --- /dev/null +++ b/root/io/uniquePointer/privacyInterp.oref @@ -0,0 +1,18 @@ + +Processing /home/pcanal/root_working/code/root/roottest/root/io/uniquePointer/privacyInterp.C... +Data member list for privacy::test + filesystem::path persistent_path + +Data member list for privacy::test1 + privacy::test1::Inner* unique_data + privacy::test1::Inner* ptr_data + +Data member list for privacy::test2 + privacy::test1 persistent_data + +Data member list for privacy::test3 + tuple persistent_data + +Data member list for privacy::test4 + +(int) 0 diff --git a/root/io/uniquePointer/privacyLinkDef.h b/root/io/uniquePointer/privacyLinkDef.h new file mode 100644 index 0000000000..bfbbeb7cea --- /dev/null +++ b/root/io/uniquePointer/privacyLinkDef.h @@ -0,0 +1,15 @@ +#pragma link C++ class test+; + +// We can generate the dictionary for this class even-though it has +// data members whose types is private. There will be a clear error +// message if the user request the StreamerInfo for this class. +#pragma link C++ class test1+; + +// Dictionary of private classes is not supported, uncommented this leads +// to the expected warning message explaining this. +// #pragma link C++ class test1::Inner+; + +#pragma link C++ class test2+; +#pragma link C++ class test3+; +#pragma link C++ class test4+; + diff --git a/root/io/uniquePointer/privacyLoad.C b/root/io/uniquePointer/privacyLoad.C new file mode 100644 index 0000000000..b67fe39222 --- /dev/null +++ b/root/io/uniquePointer/privacyLoad.C @@ -0,0 +1,31 @@ +int privacyLoad() { + gSystem->Load("privacy"); + + const char *names[] = { + "test", + "test1", + "test2", + "test3", + "test4" + }; + + for(auto name : names) { + auto cl = TClass::GetClass(name); + if (!cl) { + std::cout << "Could not find class " << name << '\n'; + return 1; + } + std::cout << "Data member list for " << name << '\n'; + for(auto member : *cl->GetStreamerInfo()->GetElements()) { + if (auto el = dynamic_cast(member)) { + std::cout << " " << el->GetTypeName(); + if (el->IsaPointer() && !TString(el->GetTypeName()).Contains("*")) + std::cout << "*"; + std::cout << " " << el->GetName() << '\n'; + } + } + std::cout << '\n'; + } + + return 0; +} diff --git a/root/io/uniquePointer/privacyLoad.eref b/root/io/uniquePointer/privacyLoad.eref new file mode 100644 index 0000000000..e1590f137e --- /dev/null +++ b/root/io/uniquePointer/privacyLoad.eref @@ -0,0 +1,6 @@ +Warning in : test: filesystem::path has no streamer or dictionary, data member "persistent_path" will not be saved +Error in : test1: test1::Inner has no streamer or dictionary, data member unique_data will not be saved +Error in : test1: test1::Inner* has no streamer or dictionary, data member ptr_data will not be saved +Error in : Could not declare alternate type for tuple since test3::Inner (or one of its context) is private or protected +Warning in : no dictionary for class tuple is available +Warning in : test3: tuple has no streamer or dictionary, data member "persistent_data" will not be saved diff --git a/root/io/uniquePointer/privacyLoad.oref b/root/io/uniquePointer/privacyLoad.oref new file mode 100644 index 0000000000..c62df3f2b4 --- /dev/null +++ b/root/io/uniquePointer/privacyLoad.oref @@ -0,0 +1,18 @@ + +Processing /home/pcanal/root_working/code/root/roottest/root/io/uniquePointer/privacyLoad.C... +Data member list for test + filesystem::path persistent_path + +Data member list for test1 + test1::Inner* unique_data + test1::Inner* ptr_data + +Data member list for test2 + test1 persistent_data + +Data member list for test3 + tuple persistent_data + +Data member list for test4 + +(int) 0