00001 #ifndef NO_PTR_CHAIN_NODE_1_H
00002 #define NO_PTR_CHAIN_NODE_1_H
00003
00023 #include <algorithm>
00024 #include <assert.h>
00025 #include "NoPtrFwd.hh"
00026 #include "nullness.hh"
00027
00028 namespace NoPtr
00029 {
00030 namespace NoPtrImpl
00031 {
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 class SegmentNode
00052 {
00053 public:
00054
00055 SegmentNode(): _other(NullPtr) {}
00056
00057 SegmentNode(SegmentNode& rhs) {connectBare(rhs);}
00058
00059 ~SegmentNode() {removeSelf();}
00060 void swap(SegmentNode& rhs) { std::swap(_other, rhs._other); }
00061
00062
00063 void connect(SegmentNode& rhs)
00064 {
00065 if (this != &rhs)
00066 {
00067 removeSelf();
00068 connectBare(rhs);
00069 }
00070 }
00071
00072 void disconnect()
00073 {
00074 removeSelf();
00075 _other = NullPtr;
00076 }
00077
00078 bool isConnected() const {return _other != NullPtr;}
00079
00080 private:
00081
00082 void connectBare(SegmentNode& rhs)
00083 {
00084 assert(! rhs.isConnected() );
00085 rhs._other = this;
00086 _other = &rhs;
00087 }
00088
00089
00090 void removeSelf()
00091 {
00092 if (_other != NullPtr)
00093 {
00094 assert(_other->_other == this);
00095 _other->_other = NullPtr;
00096 }
00097 }
00098
00099 private:
00100 SegmentNode(const SegmentNode&);
00101 SegmentNode& operator=(const SegmentNode&);
00102
00103 private:
00104 SegmentNode* _other;
00105 };
00106
00107 }
00108
00109 }
00110
00111 #endif // NO_PTR_CHAIN_NODE_1_H