codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#include <boost/shared_ptr.hpp> class SmartPimplPrivate { public: SmartPimplPrivate() { memset(data, '0', 1024); } ~SmartPimplPrivate() {} SmartPimplPrivate(const SmartPimplPrivate &other) { std::copy(other.data, other.data + 1024, data); } char data[1024]; }; class SmartPimpl { public: SmartPimpl() : d(new SmartPimplPrivate) { } void setData(int i, char value) { detach(); // Copy on write d->data[i] = value; } char data(int i) const { return d->data[i]; } void detach() { if (d.use_count() > 1) { d = boost::shared_ptr<SmartPimplPrivate>(new SmartPimplPrivate(*d)); std::cout << "---- detaching! ----\n"; } } private: boost::shared_ptr<SmartPimplPrivate> d; }; int main(int argc, char **argv) { SmartPimpl p1; p1.setData(0, 'y'); SmartPimpl p2(p1); SmartPimpl p3(p1); std::cout << p1.data(0) << "\n"; std::cout << p2.data(0) << "\n"; std::cout << p3.data(0) << "\n"; p1.setData(0, 'x'); std::cout << p1.data(0) << "\n"; std::cout << p2.data(0) << "\n"; std::cout << p3.data(0) << "\n"; return 0; }
Private
[
?
]
Run code
Submit