fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <utility>
  4.  
  5. typedef long LONG;
  6. typedef int BOOL;
  7.  
  8. struct STOP_FLAG
  9. {
  10. STOP_FLAG()
  11. : shared(new Shared())
  12. {
  13. }
  14.  
  15. ~STOP_FLAG()
  16. {
  17. shared->release();
  18. }
  19.  
  20. STOP_FLAG(const STOP_FLAG& s)
  21. : shared((s.shared->grab(), s.shared))
  22. {
  23. }
  24.  
  25. // assignment operator by copy/swap idiom
  26. STOP_FLAG& operator = (STOP_FLAG s)
  27. {
  28. std::swap(shared, s.shared);
  29. return *this;
  30. }
  31.  
  32. private:
  33. struct Shared
  34. {
  35. BOOL value;
  36. LONG refCount;
  37.  
  38. Shared() : value(), refCount()
  39. {
  40. grab();
  41. }
  42.  
  43. void grab()
  44. {
  45. std::cout << '\t' << __PRETTY_FUNCTION__ << ':' << refCount+1 << '\n';
  46. ++refCount;
  47. }
  48.  
  49. void release()
  50. {
  51. std::cout << '\t' << __PRETTY_FUNCTION__ << ':' << refCount-1 << '\n';
  52. if (!--refCount)
  53. delete this;
  54. }
  55.  
  56. } *shared;
  57. };
  58.  
  59. int main()
  60. {
  61. std::cout << "STOP_FLAG sf;" << '\n';
  62. STOP_FLAG sf;
  63. {
  64. std::cout << "STOP_FLAG s2(sf);" << '\n';
  65. STOP_FLAG s2(sf);
  66.  
  67. std::cout << "s2 = sf;" << '\n';
  68. s2 = sf;
  69.  
  70. std::cout << "STOP_FLAG s3;" << '\n';
  71. STOP_FLAG s3;
  72.  
  73. std::cout << "s3 = s2;" << '\n';
  74. s3 = s2;
  75.  
  76. std::cout << "STOP_FLAG s4[3];" << '\n';
  77. STOP_FLAG s4[3];
  78.  
  79. std::cout << "s4[0] = s3;" << '\n';
  80. s4[0] = s3;
  81. std::cout << "s4[1] = s3;" << '\n';
  82. s4[1] = s3;
  83. std::cout << "s4[2] = s3;" << '\n';
  84. s4[2] = s3;
  85.  
  86. std::cout << "STOP_FLAG s5;" << '\n';
  87. STOP_FLAG s5;
  88.  
  89. std::cout << "s3 = s5;" << '\n';
  90. s3 = s5;
  91.  
  92. std::cout << "scope exiting\n";
  93. }
  94. std::cout << "scope exited\n";
  95. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
STOP_FLAG sf;
	void STOP_FLAG::Shared::grab():1
STOP_FLAG s2(sf);
	void STOP_FLAG::Shared::grab():2
s2 = sf;
	void STOP_FLAG::Shared::grab():3
	void STOP_FLAG::Shared::release():2
STOP_FLAG s3;
	void STOP_FLAG::Shared::grab():1
s3 = s2;
	void STOP_FLAG::Shared::grab():3
	void STOP_FLAG::Shared::release():0
STOP_FLAG s4[3];
	void STOP_FLAG::Shared::grab():1
	void STOP_FLAG::Shared::grab():1
	void STOP_FLAG::Shared::grab():1
s4[0] = s3;
	void STOP_FLAG::Shared::grab():4
	void STOP_FLAG::Shared::release():0
s4[1] = s3;
	void STOP_FLAG::Shared::grab():5
	void STOP_FLAG::Shared::release():0
s4[2] = s3;
	void STOP_FLAG::Shared::grab():6
	void STOP_FLAG::Shared::release():0
STOP_FLAG s5;
	void STOP_FLAG::Shared::grab():1
s3 = s5;
	void STOP_FLAG::Shared::grab():2
	void STOP_FLAG::Shared::release():5
scope exiting
	void STOP_FLAG::Shared::release():1
	void STOP_FLAG::Shared::release():4
	void STOP_FLAG::Shared::release():3
	void STOP_FLAG::Shared::release():2
	void STOP_FLAG::Shared::release():0
	void STOP_FLAG::Shared::release():1
scope exited
	void STOP_FLAG::Shared::release():0