- #include <iostream> 
- #include <algorithm> 
- #include <utility> 
-   
- typedef long LONG; 
- typedef int BOOL; 
-   
- struct STOP_FLAG 
- { 
-     STOP_FLAG() 
-         : shared(new Shared()) 
-     { 
-     } 
-   
-     ~STOP_FLAG() 
-     { 
-         shared->release(); 
-     } 
-   
-     STOP_FLAG(const STOP_FLAG& s) 
-         : shared((s.shared->grab(), s.shared)) 
-     { 
-     } 
-   
-     // assignment operator by copy/swap idiom 
-     STOP_FLAG& operator = (STOP_FLAG s) 
-     { 
-         std::swap(shared, s.shared); 
-         return *this; 
-     } 
-   
- private: 
-     struct Shared 
-     { 
-         BOOL value; 
-         LONG refCount; 
-   
-         Shared() : value(), refCount() 
-         { 
-             grab(); 
-         } 
-   
-         void grab() 
-         { 
-             std::cout << '\t' << __PRETTY_FUNCTION__ << ':' << refCount+1 << '\n'; 
-             ++refCount; 
-         } 
-   
-         void release() 
-         { 
-             std::cout << '\t' << __PRETTY_FUNCTION__ << ':' << refCount-1 << '\n'; 
-             if (!--refCount) 
-                 delete this; 
-         } 
-   
-     } *shared; 
- }; 
-   
- int main() 
- { 
-     std::cout << "STOP_FLAG sf;" << '\n'; 
-     STOP_FLAG sf; 
-     { 
-         std::cout << "STOP_FLAG s2(sf);" << '\n'; 
-         STOP_FLAG s2(sf); 
-   
-         std::cout << "s2 = sf;" << '\n'; 
-         s2 = sf; 
-   
-         std::cout << "STOP_FLAG s3;" << '\n'; 
-         STOP_FLAG s3; 
-   
-         std::cout << "s3 = s2;" << '\n'; 
-         s3 = s2; 
-   
-         std::cout << "STOP_FLAG s4[3];" << '\n'; 
-         STOP_FLAG s4[3]; 
-   
-         std::cout << "s4[0] = s3;" << '\n'; 
-         s4[0] = s3; 
-         std::cout << "s4[1] = s3;" << '\n'; 
-         s4[1] = s3; 
-         std::cout << "s4[2] = s3;" << '\n'; 
-         s4[2] = s3; 
-   
-         std::cout << "STOP_FLAG s5;" << '\n'; 
-         STOP_FLAG s5; 
-   
-         std::cout << "s3 = s5;" << '\n'; 
-         s3 = s5; 
-   
-         std::cout << "scope exiting\n"; 
-     } 
-     std::cout << "scope exited\n"; 
- }