00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
#ifndef _R_ROPE_REP_H
00016
#define _R_ROPE_REP_H
00017
00018
#include "MNRopeRefCount.h"
00019
#include "MNProtectedVar.h"
00020
00058 struct MNRopeRep
00059 :
public MNRopeRefCount
00060 {
00061
public:
00062 typedef ProtectedPtr<uchar_t*> ProtectedUCharPtr;
00063
00064
enum {
00065
_S_max_rope_depth = 45
00066 };
00067 enum _Tag {
00068
_S_leaf,
_S_concat,
_S_substringfn,
_S_function
00069 };
00070
00071 size_t
_M_size;
00072 _Tag _M_tag:8;
00073 bool _M_is_balanced:8;
00074 unsigned char _M_depth;
00075
00084 ProtectedUCharPtr _M_c_string;
00085
00086 MNRopeRep(_Tag __t,
int __d,
bool __b, size_t __size)
00087 :
MNRopeRefCount(1)
00088 ,
_M_size(__size)
00089 ,
_M_tag(__t)
00090 ,
_M_is_balanced(__b)
00091 ,
_M_depth(__d)
00092 ,
_M_c_string(0)
00093 { }
00094
00095 virtual ~MNRopeRep( )
00096 { }
00097
00098
static void _S_free_string( uchar_t*, size_t __len);
00099
00100
void _M_free_c_string();
00101
void _M_free_tree();
00102
00103 void _M_unref_nonnil()
00104 {
00105
if (0 ==
_M_decr())
_M_free_tree();
00106 }
00107
00108 void _M_ref_nonnil()
00109 {
00110
_M_incr();
00111 }
00112
00113 static void _S_unref(
MNRopeRep* __t)
00114 {
00115
if (0 != __t) {
00116 __t->
_M_unref_nonnil();
00117 }
00118 }
00119
00120 static void _S_ref(
MNRopeRep* __t)
00121 {
00122
if (0 != __t) __t->
_M_incr();
00123 }
00124
00125 static void _S_free_if_unref(
MNRopeRep* __t)
00126 {
00127
if (0 != __t && 0 == __t->
_M_ref_count) __t->
_M_free_tree();
00128 }
00129 };
00130
00132
00133
#endif
00134