Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
pcanal committed Oct 26, 2023
1 parent 52035ab commit d87a6ed
Show file tree
Hide file tree
Showing 12 changed files with 242 additions and 0 deletions.
20 changes: 20 additions & 0 deletions root/io/uniquePointer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
50 changes: 50 additions & 0 deletions root/io/uniquePointer/ns_privacy.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#ifndef ns_privacy_hh
#define ns_privacy_hh
#include <iostream>
#include <filesystem>
#include <tuple>

namespace fs = std::filesystem;

namespace privacy
{

class test
{
public:
test() = default;
~test() = default;;

private:
fs::path path; ///<!
fs::path persistent_path;
};

class test1 {
private:
struct Inner { struct Most {}; };
std::unique_ptr<Inner> unique_data;
Inner *ptr_data;
};

class test2 {
private:
test1 transient_data; ///<!
test1 persistent_data;
};

class test3 {
private:
struct Inner {};
std::tuple<int, Inner> persistent_data;
std::tuple<int, int, Inner> transient_data; ///<!
};

class test4 {
private:
test3 transient_data; ///<!
};

} // namespace privacy

#endif // ns_privacy_hh
45 changes: 45 additions & 0 deletions root/io/uniquePointer/privacy.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef privacy_hh
#define privacy_hh
#include <iostream>
#include <filesystem>
#include <tuple>

namespace fs = std::filesystem;

class test
{
public:
test() = default;
~test() = default;;

private:
fs::path path; ///<!
fs::path persistent_path;
};

class test1 {
private:
struct Inner { struct Most {}; };
std::unique_ptr<Inner> unique_data;
Inner *ptr_data;
};

class test2 {
private:
test1 transient_data; ///<!
test1 persistent_data;
};

class test3 {
private:
struct Inner {};
std::tuple<int, Inner> persistent_data;
std::tuple<int, int, Inner> transient_data; ///<!
};

class test4 {
private:
test3 transient_data; ///<!
};

#endif
Empty file.
Empty file.
32 changes: 32 additions & 0 deletions root/io/uniquePointer/privacyInterp.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include "ns_privacy.hh"

int privacyInterp() {

const char *names[] = {
"privacy::test",
"privacy::test1",
"privacy::test2",
"privacy::test3",
"privacy::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<TStreamerElement*>(member)) {
std::cout << " " << el->GetTypeName();
if (el->IsaPointer() && !TString(el->GetTypeName()).Contains("*"))
std::cout << "*";
std::cout << " " << el->GetName() << '\n';
}
}
std::cout << '\n';
}

return 0;
}
7 changes: 7 additions & 0 deletions root/io/uniquePointer/privacyInterp.eref
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Warning in <TStreamerInfo::Build>: privacy::test: filesystem::path has no streamer or dictionary, data member "persistent_path" will not be saved
Error in <TStreamerInfo::Build>: privacy::test1: privacy::test1::Inner has no streamer or dictionary, data member unique_data will not be saved
Error in <TStreamerInfo::Build>: privacy::test1: privacy::test1::Inner* has no streamer or dictionary, data member ptr_data will not be saved
Warning in <TStreamerInfo::Build>: privacy::test2: privacy::test1 has no streamer or dictionary, data member "persistent_data" will not be saved
Error in <Load>: Could not declare alternate type for tuple<int,privacy::test3::Inner> since privacy::test3::Inner (or one of its context) is private or protected
Warning in <TClass::Init>: no dictionary for class tuple<int,privacy::test3::Inner> is available
Warning in <TStreamerInfo::Build>: privacy::test3: tuple<int,privacy::test3::Inner> has no streamer or dictionary, data member "persistent_data" will not be saved
18 changes: 18 additions & 0 deletions root/io/uniquePointer/privacyInterp.oref
Original file line number Diff line number Diff line change
@@ -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<int,privacy::test3::Inner> persistent_data

Data member list for privacy::test4

(int) 0
15 changes: 15 additions & 0 deletions root/io/uniquePointer/privacyLinkDef.h
Original file line number Diff line number Diff line change
@@ -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+;

31 changes: 31 additions & 0 deletions root/io/uniquePointer/privacyLoad.C
Original file line number Diff line number Diff line change
@@ -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<TStreamerElement*>(member)) {
std::cout << " " << el->GetTypeName();
if (el->IsaPointer() && !TString(el->GetTypeName()).Contains("*"))
std::cout << "*";
std::cout << " " << el->GetName() << '\n';
}
}
std::cout << '\n';
}

return 0;
}
6 changes: 6 additions & 0 deletions root/io/uniquePointer/privacyLoad.eref
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Warning in <TStreamerInfo::Build>: test: filesystem::path has no streamer or dictionary, data member "persistent_path" will not be saved
Error in <TStreamerInfo::Build>: test1: test1::Inner has no streamer or dictionary, data member unique_data will not be saved
Error in <TStreamerInfo::Build>: test1: test1::Inner* has no streamer or dictionary, data member ptr_data will not be saved
Error in <Load>: Could not declare alternate type for tuple<int,test3::Inner> since test3::Inner (or one of its context) is private or protected
Warning in <TClass::Init>: no dictionary for class tuple<int,test3::Inner> is available
Warning in <TStreamerInfo::Build>: test3: tuple<int,test3::Inner> has no streamer or dictionary, data member "persistent_data" will not be saved
18 changes: 18 additions & 0 deletions root/io/uniquePointer/privacyLoad.oref
Original file line number Diff line number Diff line change
@@ -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<int,test3::Inner> persistent_data

Data member list for test4

(int) 0

0 comments on commit d87a6ed

Please sign in to comment.