author | Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
Wed, 02 Jan 2008 09:09:24 +0100 | |
changeset 2230 | 9f13ac3291e0 |
parent 732 | df256f32b6ae |
permissions | -rw-r--r-- |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
1 |
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
2 |
#include "ns3/ptr.h" |
542
00722b9a01b3
Ptr changed to use Object's refcounts
Raj Bhattacharjea <raj.b@gatech.edu>
parents:
286
diff
changeset
|
3 |
#include "ns3/object.h" |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
4 |
#include <iostream> |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
5 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
6 |
using namespace ns3; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
7 |
|
542
00722b9a01b3
Ptr changed to use Object's refcounts
Raj Bhattacharjea <raj.b@gatech.edu>
parents:
286
diff
changeset
|
8 |
class A : public Object |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
9 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
10 |
public: |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
11 |
A (); |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
12 |
~A (); |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
13 |
void Method (void); |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
14 |
}; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
15 |
A::A () |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
16 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
17 |
std::cout << "A constructor" << std::endl; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
18 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
19 |
A::~A() |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
20 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
21 |
std::cout << "A destructor" << std::endl; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
22 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
23 |
void |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
24 |
A::Method (void) |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
25 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
26 |
std::cout << "A method" << std::endl; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
27 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
28 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
29 |
static Ptr<A> g_a = 0; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
30 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
31 |
static Ptr<A> |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
32 |
StoreA (Ptr<A> a) |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
33 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
34 |
Ptr<A> prev = g_a; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
35 |
g_a = a; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
36 |
return prev; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
37 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
38 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
39 |
static void |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
40 |
ClearA (void) |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
41 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
42 |
g_a = 0; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
43 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
44 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
45 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
46 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
47 |
int main (int argc, char *argv[]) |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
48 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
49 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
50 |
// Create a new object of type A, store it in global |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
51 |
// variable g_a |
2230
9f13ac3291e0
add CreateObject<> to instanciate subclasses of the Object base class. Replaces Create<>.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
732
diff
changeset
|
52 |
Ptr<A> a = CreateObject<A> (); |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
53 |
a->Method (); |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
54 |
Ptr<A> prev = StoreA (a); |
286
57e6a2006962
convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
226
diff
changeset
|
55 |
NS_ASSERT (prev == 0); |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
56 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
57 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
58 |
{ |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
59 |
// Create a new object of type A, store it in global |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
60 |
// variable g_a, get a hold on the previous A object. |
2230
9f13ac3291e0
add CreateObject<> to instanciate subclasses of the Object base class. Replaces Create<>.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
732
diff
changeset
|
61 |
Ptr<A> a = CreateObject<A> (); |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
62 |
Ptr<A> prev = StoreA (a); |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
63 |
// call method on object |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
64 |
prev->Method (); |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
65 |
// Clear the currently-stored object |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
66 |
ClearA (); |
573
0da9201a048e
rename Ptr::Get and Ptr::Peek to GetPointer and PeekPointer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
544
diff
changeset
|
67 |
// get the raw pointer and release it. |
0da9201a048e
rename Ptr::Get and Ptr::Peek to GetPointer and PeekPointer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
544
diff
changeset
|
68 |
A *raw = GetPointer (prev); |
544
cbc4158d47c9
remove ptr::Remove, make ptr::Peek share the same signature as ptr::Get
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
542
diff
changeset
|
69 |
prev = 0; |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
70 |
raw->Method (); |
573
0da9201a048e
rename Ptr::Get and Ptr::Peek to GetPointer and PeekPointer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
544
diff
changeset
|
71 |
raw->Unref (); |
226
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
72 |
} |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
73 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
74 |
|
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
75 |
return 0; |
1f8c4e56bc86
add smart pointer sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
76 |
} |