Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
vo001_AdoptOrOwnMemory.py
Go to the documentation of this file.
1 ## \file
2 ## \ingroup tutorial_vecops
3 ## \notebook -nodraw
4 ## In this tutorial we learn how the RVec class can be used to
5 ## adopt existing memory or allocate some.
6 ##
7 ## \macro_code
8 ## \macro_output
9 ##
10 ## \date May 2018
11 ## \author Danilo Piparo
12 
13 import ROOT
14 
15 # We use this class for didactic purposes: upon copy, a line is printed to the terminal.
16 
17 ROOT.gInterpreter.Declare('''
18 class UponCopyPrinter {
19 public:
20  UponCopyPrinter() = default;
21  UponCopyPrinter(UponCopyPrinter &&) = default;
22  UponCopyPrinter(const UponCopyPrinter &) { std::cout << "Invoking copy c'tor!" << std::endl; }
23 };
24 ''')
25 
26 RVec_UponCopyPrinter = ROOT.ROOT.VecOps.RVec(ROOT.UponCopyPrinter)
27 
28 # One of the essential features of RVec is its ability of adopting and owning memory.
29 # Internally this is handled by the ROOT::Detail::VecOps::RAdoptAllocator class.
30 
31 # Let's create an RVec of UponCopyPrinter instances. We expect no printout:
32 v = RVec_UponCopyPrinter(3)
33 
34 # Let's adopt the memory from v into v2. We expect no printout:
35 v2 = RVec_UponCopyPrinter(v.data(), v.size())
36 
37 # OK, let's check the addresses of the memory associated to the two RVecs It is the same!
38 print("%s and %s" %(v.data(), v2.data()))
39 
40 # Now, upon reallocation, the RVec stops adopting the memory and starts owning it. And yes,
41 # a copy is triggered. Indeed internally the storage of the RVec is an std::vector. Moreover,
42 # the interface of the RVec is very, very similar to the one of std::vector: you have already
43 # noticed it when the `data()` method was invoked, right?
44 v2.resize(4)
45 
46 # Of course, now the addresses are different.
47 print("%s and %s" %(v.data(), v2.data()))