Skip to content

Commit 6e165da

Browse files
committed
format
1 parent 179306d commit 6e165da

4 files changed

Lines changed: 145 additions & 144 deletions

File tree

‎cpp/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
1. [tuple](tuple.cpp)
100100
1. Smart pointers
101101
1. [unique_ptr](unique_ptr.cpp)
102+
1. [shared_ptr](shared_ptr.cpp)
102103
1. [Interactive](interactive/)
103104
1. [bst_vs_heap](interactive/bst_vs_heap.cpp)
104105
1. [chrono](interactive/chrono.cpp)

‎cpp/common.hpp‎

Lines changed: 70 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -106,76 +106,81 @@ void printCallStack() {
106106
*
107107
* TODO break this class up.
108108
*/
109-
class NoBaseNoMember {
110-
public:
111-
112-
int i;
113-
static int si;
114-
115-
/// Default constructor
116-
NoBaseNoMember() : i(0) {
117-
callStack.push_back("NoBaseNoMember::NoBaseNoMember()");
118-
}
119-
120-
/// Copy constructor
121-
NoBaseNoMember(const NoBaseNoMember& other) : i(other.i) {
122-
callStack.push_back("NoBaseNoMember::NoBaseNoMember(NoBaseNoMember)");
123-
}
124-
125-
NoBaseNoMember(int i) : i(i) {callStack.push_back("NoBaseNoMember::NoBaseNoMember(int)");}
126-
127-
/// Assign
128-
NoBaseNoMember& operator= (const NoBaseNoMember& rhs) {
129-
this->i = rhs.i;
130-
callStack.push_back("NoBaseNoMember::operator=");
131-
return *this;
132-
}
133-
134-
/// Destructor
135-
~NoBaseNoMember() { callStack.push_back("NoBaseNoMember::~NoBaseNoMember()"); }
136-
137-
void method() { callStack.push_back("NoBaseNoMember::method()"); }
138-
139-
static NoBaseNoMember create() {
140-
return NoBaseNoMember();
141-
}
142-
143-
static NoBaseNoMember createNrvo() {
144-
NoBaseNoMember c;
145-
return c;
146-
}
147-
148-
/// It would be hard or impossible to do RVO for this function.
149-
static NoBaseNoMember createNrvoHard(bool b = false) {
150-
//2 int constructors
151-
NoBaseNoMember cf = NoBaseNoMember(0);
152-
NoBaseNoMember ct = NoBaseNoMember(1);
153-
return b ? ct : cf;
154-
//2 int destructors
155-
}
156-
157-
static void temporaryReference(NoBaseNoMember& temp) {
158-
temp.i = 0;
159-
}
160-
161-
static void temporaryReferenceConst(const NoBaseNoMember& temp) {
162-
si = temp.i;
163-
}
109+
struct NoBaseNoMember {
110+
int i;
111+
static int si;
112+
static int count;
113+
114+
/// Default constructor
115+
NoBaseNoMember() : i(0) {
116+
callStack.push_back("NoBaseNoMember::NoBaseNoMember()");
117+
count++;
118+
}
119+
120+
/// Copy constructor
121+
NoBaseNoMember(const NoBaseNoMember& other) : i(other.i) {
122+
callStack.push_back("NoBaseNoMember::NoBaseNoMember(NoBaseNoMember)");
123+
}
124+
125+
NoBaseNoMember(int i) : i(i) {
126+
callStack.push_back("NoBaseNoMember::NoBaseNoMember(int)");
127+
count++;
128+
}
129+
130+
/// Assign
131+
NoBaseNoMember& operator= (const NoBaseNoMember& rhs) {
132+
this->i = rhs.i;
133+
callStack.push_back("NoBaseNoMember::operator=");
134+
return *this;
135+
}
136+
137+
/// Destructor
138+
~NoBaseNoMember() {
139+
callStack.push_back("NoBaseNoMember::~NoBaseNoMember()");
140+
count--;
141+
}
142+
143+
void method() { callStack.push_back("NoBaseNoMember::method()"); }
144+
145+
static NoBaseNoMember create() {
146+
return NoBaseNoMember();
147+
}
148+
149+
static NoBaseNoMember createNrvo() {
150+
NoBaseNoMember c;
151+
return c;
152+
}
153+
154+
/// It would be hard or impossible to do RVO for this function.
155+
static NoBaseNoMember createNrvoHard(bool b = false) {
156+
//2 int constructors
157+
NoBaseNoMember cf = NoBaseNoMember(0);
158+
NoBaseNoMember ct = NoBaseNoMember(1);
159+
return b ? ct : cf;
160+
//2 int destructors
161+
}
162+
163+
static void temporaryReference(NoBaseNoMember& temp) {
164+
temp.i = 0;
165+
}
166+
167+
static void temporaryReferenceConst(const NoBaseNoMember& temp) {
168+
si = temp.i;
169+
}
164170
};
165171

172+
int NoBaseNoMember::count = 0;
166173
int NoBaseNoMember::si;
167174

168-
class NoBaseNoMember0 {
169-
public:
170-
NoBaseNoMember0(){callStack.push_back("NoBaseNoMember0::NoBaseNoMember0()");}
171-
~NoBaseNoMember0(){callStack.push_back("NoBaseNoMember0::~NoBaseNoMember0()");}
172-
void method(){callStack.push_back("NoBaseNoMember0::method()");}
175+
struct NoBaseNoMember0 {
176+
NoBaseNoMember0(){callStack.push_back("NoBaseNoMember0::NoBaseNoMember0()");}
177+
~NoBaseNoMember0(){callStack.push_back("NoBaseNoMember0::~NoBaseNoMember0()");}
178+
void method(){callStack.push_back("NoBaseNoMember0::method()");}
173179
};
174180

175-
class NoBaseNoMember1 {
176-
public:
177-
NoBaseNoMember1(){callStack.push_back("NoBaseNoMember1::NoBaseNoMember1()");}
178-
~NoBaseNoMember1(){callStack.push_back("NoBaseNoMember1::~NoBaseNoMember1()");}
179-
void method(){callStack.push_back("NoBaseNoMember1::method()");}
181+
struct NoBaseNoMember1 {
182+
NoBaseNoMember1(){callStack.push_back("NoBaseNoMember1::NoBaseNoMember1()");}
183+
~NoBaseNoMember1(){callStack.push_back("NoBaseNoMember1::~NoBaseNoMember1()");}
184+
void method(){callStack.push_back("NoBaseNoMember1::method()");}
180185
};
181186
#endif

‎cpp/shared_ptr.cpp‎

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,48 @@
1-
/*
2-
# shared_ptr
3-
4-
Introuced in C++11, before that as part of boost.
5-
6-
Reference counts usages, deletes data when the last one is gone.
7-
*/
1+
/* # shared_ptr
2+
*
3+
* Introuced in C++11, before that as part of boost.
4+
*
5+
* Reference counts usages, deletes data when the last one is gone.
6+
*/
87

98
#include "common.hpp"
109

1110
int main() {
1211
#if __cplusplus >= 201103L
13-
{
14-
callStack.clear();
15-
16-
// First reference
17-
std::shared_ptr<NoBaseNoMember> sp1(new NoBaseNoMember(1));
18-
assert(sp1.use_count() == 1);
19-
assert(sp1->i == 1);
20-
21-
// Create reference with copy constructor.
22-
std::shared_ptr<NoBaseNoMember> sp2(sp1);
23-
assert(sp1.use_count() == 2);
24-
assert(sp2->i == 1);
25-
26-
// Create reference with assignment constructor.
27-
std::shared_ptr<NoBaseNoMember> sp3;
28-
sp3 = sp1;
29-
assert(sp1.use_count() == 3);
30-
assert(sp3->i == 1);
31-
32-
// ERROR No converstion operator to pointer defined.
33-
//NoBaseNoMember *spp = sp1;
34-
35-
// Replace one reference with a new pointer.
36-
sp1 = std::shared_ptr<NoBaseNoMember>(new NoBaseNoMember(2));
37-
// ERROR No constructor directly from pointers.
38-
//sp1 = new NoBaseNoMember(2);
39-
assert(sp1.use_count() == 1);
40-
assert(sp2.use_count() == 2);
41-
assert(sp1->i == 2);
42-
assert(sp2->i == 1);
43-
44-
// Replace the remaining references and check that the destructor got called.
45-
sp2 = sp1;
46-
assert(callStack.back() != "NoBaseNoMember::~NoBaseNoMember()");
47-
sp3 = sp1;
48-
assert(callStack.back() == "NoBaseNoMember::~NoBaseNoMember()");
49-
}
12+
callStack.clear();
13+
14+
// First reference
15+
std::shared_ptr<NoBaseNoMember> sp1(new NoBaseNoMember(1));
16+
assert(sp1.use_count() == 1);
17+
assert(sp1->i == 1);
18+
19+
// Create reference with copy constructor.
20+
std::shared_ptr<NoBaseNoMember> sp2(sp1);
21+
assert(sp1.use_count() == 2);
22+
assert(sp2->i == 1);
23+
24+
// Create reference with assignment constructor.
25+
std::shared_ptr<NoBaseNoMember> sp3;
26+
sp3 = sp1;
27+
assert(sp1.use_count() == 3);
28+
assert(sp3->i == 1);
29+
30+
// ERROR No converstion operator to pointer defined.
31+
//NoBaseNoMember *spp = sp1;
32+
33+
// Replace one reference with a new pointer.
34+
sp1 = std::shared_ptr<NoBaseNoMember>(new NoBaseNoMember(2));
35+
// ERROR No constructor directly from pointers.
36+
//sp1 = new NoBaseNoMember(2);
37+
assert(sp1.use_count() == 1);
38+
assert(sp2.use_count() == 2);
39+
assert(sp1->i == 2);
40+
assert(sp2->i == 1);
41+
42+
// Replace the remaining references and check that the destructor got called.
43+
sp2 = sp1;
44+
assert(callStack.back() != "NoBaseNoMember::~NoBaseNoMember()");
45+
sp3 = sp1;
46+
assert(callStack.back() == "NoBaseNoMember::~NoBaseNoMember()");
5047
#endif
5148
}

‎cpp/unique_ptr.cpp‎

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
/*
2-
# unique_ptr
3-
4-
Sample use case:
5-
6-
- you want a dynamic array a dynamically allocated derived class
7-
- thus you have to use pointers for polymorphism. Otherwise objects can have different sizes, and arrays can't be used.
8-
- how to prevent memory leaks?
9-
10-
http://en.cppreference.com/w/cpp/memory/unique_ptr
11-
12-
unique_ptr may incur an extra dereferece cost, but it is usually well worth it.
13-
14-
In Java, everything can be though as a smart pointer (shared),
15-
so using this is still more efficient than Java, since C++ can know the exact
16-
lifetime of objects, and release them immediately when they are done.
17-
*/
1+
/* # unique_ptr
2+
*
3+
* Sample use case:
4+
*
5+
* - you want a dynamic array a dynamically allocated derived class
6+
* - thus you have to use pointers for polymorphism. Otherwise objects can have different sizes, and arrays can't be used.
7+
* - how to prevent memory leaks?
8+
*
9+
* http://en.cppreference.com/w/cpp/memory/unique_ptr
10+
*
11+
* unique_ptr may incur an extra dereferece cost, but it is usually well worth it.
12+
*
13+
* In Java, everything can be though as a smart pointer (shared),
14+
* so using this is still more efficient than Java, since C++ can know the exact
15+
* lifetime of objects, and release them immediately when they are done.
16+
*/
1817

1918
#include "common.hpp"
2019

@@ -179,24 +178,23 @@ int main() {
179178
assert(Base::count == 0);
180179
}
181180

182-
/*
183-
# unique_ptr function arguments
184-
185-
- transferring ownership TODO examples
186-
- use raw pointers on the interface, and convert it to unique_ptr inside callee
187-
- if you already have an unique_ptr, release() it
188-
- this allows you to not tie down to a specific smart pointer on the function interface
189-
- use unique_ptr on interface and move on caller.
190-
- Advantage: unique_ptr on interface documents ownership transfer,
191-
and prevents callee from passing non new pointer to it by mistake.
192-
- TODO for not transferring ownership:
193-
- `const & std::unique_ptr<T>`
194-
- `get()`. Simple and efficient. But how to use it for containers like `vector<std::unique_ptr>`?
195-
- `T&` on function, `*t` on caller. Looks good!
196-
197-
- http://stackoverflow.com/questions/8114276/how-do-i-pass-a-unique-ptr-argument-to-a-constructor-or-a-functionhttp://stackoverflow.com/questions/8114276/how-do-i-pass-a-unique-ptr-argument-to-a-constructor-or-a-function
198-
- http://stackoverflow.com/questions/11277249/how-to-pass-stdunique-ptr-around
199-
*/
181+
/* # unique_ptr function arguments
182+
*
183+
* - transferring ownership TODO examples
184+
* - use raw pointers on the interface, and convert it to unique_ptr inside callee
185+
* - if you already have an unique_ptr, release() it
186+
* - this allows you to not tie down to a specific smart pointer on the function interface
187+
* - use unique_ptr on interface and move on caller.
188+
* - Advantage: unique_ptr on interface documents ownership transfer,
189+
* and prevents callee from passing non new pointer to it by mistake.
190+
* - TODO for not transferring ownership:
191+
* - `const & std::unique_ptr<T>`
192+
* - `get()`. Simple and efficient. But how to use it for containers like `vector<std::unique_ptr>`?
193+
* - `T&` on function, `*t` on caller. Looks good!
194+
*
195+
* - http://stackoverflow.com/questions/8114276/how-do-i-pass-a-unique-ptr-argument-to-a-constructor-or-a-functionhttp://stackoverflow.com/questions/8114276/how-do-i-pass-a-unique-ptr-argument-to-a-constructor-or-a-function
196+
* - http://stackoverflow.com/questions/11277249/how-to-pass-stdunique-ptr-around
197+
*/
200198
{
201199
}
202200

0 commit comments

Comments
 (0)