Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Fred/String/StringAt.inl

Go to the documentation of this file.
00001 #ifndef __J2K__JString_At_INL__
00002 #define __J2K__JString_At_INL__
00003 
00004 #include <j2k/Fred/String/String.hpp>
00005 
00006 // TODO:  Check for effects of LOCK functions !
00007 // StrAdd also !
00008 
00009 // Use CopyBeforeWrite();
00010 
00011 /** ANDREA ***************************************************
00012 
00013   This module defines a few inline and a few regular
00014   methods. How do you think one can use it ? #including
00015   a .cpp (so recompiling all the functions every time) ?
00016 **************************************************************/
00017 
00018 // same as getAt
00019 inline char JString::operator[](long index) const {
00020   if ( index < 0 ) return (char)NULL;
00021   return getAt( (size_t)index );
00022 }
00023 
00024 inline char JString::getAt( size_t index ) const {
00025   if ( (long)index == -1 ) return (char)NULL;
00026   if ( index >= pData->length ) {
00027     return (char)NULL;
00028   }
00029  
00030   return pData->data[ index ];
00031 }
00032 
00033 inline char JString::charAt() {
00034   JString temp = at( (size_t)0, (size_t)1 );
00035   register char c = temp.pData->data[0];
00036   temp.pData->Dec();
00037   return c;
00038 }
00039 
00040 inline char JString::charAt( const char* s ) {
00041   JString temp = at( s, (size_t)0, (size_t)1 );
00042   register char c = temp.pData->data[0];
00043   temp.pData->Dec();
00044   return c;
00045 }
00046 
00047 inline char JString::charAt( const JString& S ) {
00048   JString temp = at( S.pData->data, (size_t)0, (size_t)1 );
00049   register char c = temp.pData->data[0];
00050   temp.pData->Dec();
00051   return c;
00052 }
00053 
00054 inline const JString& JString::modifyAt( const JString& S )
00055 {
00056   return modifyAt( S.pData->data, (size_t)0, S.pData->length );
00057 }
00058                
00059 inline const JString& JString::modifyAt( const JString& S, size_t offset )
00060 {
00061   return modifyAt( S.pData->data, offset, S.pData->length );
00062 }
00063 
00064 inline const JString& JString::modifyAt( const JString& S, size_t offset, size_t length )
00065 {
00066    return modifyAt( S.pData->data, offset, S.pData->length );
00067 }
00068 
00069 inline const JString& JString::modifyAt( const char* s )
00070 {
00071    return modifyAt( s, (size_t)0, (size_t)0 );
00072 }   
00073 
00074 inline const JString& JString::modifyAt( const char* s, size_t offset )
00075 {
00076    return modifyAt( s, offset, (size_t)0 );
00077 }   
00078 
00079 inline const JString& JString::modifyAt( const char* s, size_t offset, size_t length )
00080 {
00081   if ( s == NULL || *s == '\0' ) return *this;
00082 
00083   long where = Find( s, offset );
00084 
00085   if ( where >= 0 ) 
00086   {
00087     // -- Modify THIS JString Object.
00088 
00089     JStringData* sd = pData;
00090 
00091     size_t l = strlen( s );
00092     long len = (long)length;
00093 
00094     if ( length > l || length == 0 ) len = l;
00095 
00096     long delta = (long)length - (long)offset - len;
00097 
00098     if ( delta >= 0 ) { // No buffer increase
00099       CopyBeforeWrite();
00100       memcpy( pData->data + where, s, len ); 
00101 
00102       pData->data[ pData->length ] = '\0';  
00103 
00104     } else {
00105       size_t newLen = sd->length - delta;
00106       pData = new JStringData( sd->data, newLen );  // It's  -(delta < 0) give us a +     
00107       memcpy( pData->data + where, s, len ); 
00108 
00109       pData->length = newLen;
00110       pData->data[ newLen ] = '\0';  
00111 
00112    /*
00113      This Null ending is needed since the last string
00114      might not be ended by '\0' or in case the copy
00115      doesn't go up to Zero. To be checked!
00116    */
00117 
00118       sd->Dec();  // Suicide we don't care.
00119     }
00120   }
00121 
00122   return *this;
00123 }  
00124 
00125 inline JString JString::at() { return JString( *this ); } // get a copy
00126 
00127 inline JString JString::at( const char* s) {    return at( s, (size_t)0 ); }
00128 inline JString JString::at( const JString& S) { return at( S.pData->data, (size_t)0 ); }
00129 
00130 inline JString JString::at( const JString& S, size_t startpos ) {
00131   return at( S.pData->data, startpos );
00132 }
00133 
00134 inline JString JString::at( const JString& S, size_t startpos, size_t length ) {
00135   return at( S.pData->data, startpos, length );
00136 }
00137 
00138 inline JString JString::right( size_t length ) { 
00139   return at( pData->length - length, length ); 
00140 }
00141 
00142 inline JString JString::after( const char* s ) {
00143   if ( s == NULL || *s == '\0' ) return *this;
00144   long where = Find( s, (size_t)0 );
00145   if ( where >= 0 ) 
00146   {
00147     return at( (size_t)where );
00148   } else {
00149     return *this;
00150   }
00151 }
00152 
00153 inline JString JString::after( const char* s, size_t startpos ) {
00154   if ( s == NULL || *s == '\0' ) return *this;
00155   long where = Find( (char*)(s + startpos), (size_t)0 );
00156   if ( where >= 0 )
00157   {
00158     return at( (size_t)where + startpos );
00159   } else {
00160     return *this;
00161   }
00162 }
00163 
00164 inline JString JString::after( const char* s, size_t startpos, size_t length ) {
00165   if ( s == NULL || *s == '\0' ) return *this;
00166   long where = Find( (char*)(s + startpos), (size_t)0 );
00167   if ( where >= 0 )
00168   {
00169     return at( (size_t)where + startpos + 1, length );
00170   } else {
00171     return *this;
00172   }
00173 }
00174 
00175 inline JString JString::before( const char* s ) {
00176   if ( s == NULL || *s == '\0' ) return *this;
00177   long where = Find( s, (size_t)0 );
00178   if ( where >= 0 )
00179   {
00180     return at( (size_t)0, (size_t)where );
00181   } else {
00182     return *this;
00183   }
00184 }
00185 
00186 // startpos of Search not String!
00187 // Design decision since it's more useful like that.
00188 // startpos of String can be obtained in few steps or with mid
00189 inline JString JString::before( const char* s, size_t startpos ) {
00190   if ( s == NULL || *s == '\0' ) return *this;
00191   long where = Find( s + startpos, 0 );
00192   if ( where >= 0 )
00193   {
00194     return at( (size_t)0, (size_t)where );
00195   } else {
00196     return *this;
00197   }
00198 }
00199 
00200 inline JString JString::beforeStr( const char* s, size_t startpos ) {
00201   if ( s == NULL || *s == '\0' ) return *this;
00202   long where = Find( s + startpos, (size_t)0 );
00203   if ( where >= 0 )
00204   {
00205     return at( startpos, (size_t)where );
00206   } else {
00207     return *this;
00208   }
00209 }
00210 
00211 inline JString JString::before( const char* s, size_t startpos, size_t length ) {
00212   if ( s == NULL || *s == '\0' ) return *this;
00213   long where = Find( s + startpos, (size_t)0 );
00214   if ( where >= 0 )
00215   {
00216     long ini = where - (long)length;
00217     if ( ini < 0 ) ini = 0;
00218     return at( (size_t)ini , (size_t)where );
00219   } else {
00220     return *this;
00221   }
00222 }
00223 
00224 inline JString JString::left( size_t length )  { 
00225   return at( (size_t)0, length ); 
00226 }
00227 
00228 inline JString JString::mid( const JString& S, size_t startpos, size_t length ) {
00229   return at( S.pData->data, startpos, length );
00230 }
00231 
00232 inline JString JString::mid( const char* s, size_t startpos, size_t length ) {
00233   return at( s, startpos, length );
00234 }
00235 
00236 inline JString JString::ltrim( char ch ) const {
00237   // find first single character
00238   // return -1 if not found and index otherwise
00239   for( size_t l = 0; l < pData->length; l++ ) {
00240     if ( pData->data[l] == ch ) return JString( pData->data+l );
00241   }
00242   return JString();
00243 }
00244 
00245 // Same as at:
00246 // operator()(...) -> at(...)
00247 
00248 inline JString JString::operator()( size_t startpos, size_t length ) { 
00249   return at( startpos, length ); 
00250 }
00251 
00252 inline JString JString::operator()( size_t startpos  ) { return at( startpos ); }
00253 inline JString JString::operator()( const char* s    ) { return at( s, 0 ); }
00254 inline JString JString::operator()( const JString& S ) { return at( S.pData->data, 0 ); }
00255 
00256 inline JString JString::operator()( const char* s,    size_t startpos ) { 
00257   return at( s, startpos ); 
00258 }
00259 
00260 inline JString JString::operator()( const JString& S, size_t startpos ) { 
00261   return at( S.pData->data, startpos ); 
00262 }
00263 
00264 inline JString JString::operator()( const char* s,    size_t startpos, size_t length ) { 
00265   return at( s, startpos, length ); 
00266 }
00267 
00268 inline JString JString::operator()( const JString& S, size_t startpos, size_t length ) {
00269   return at( S.pData->data, startpos, length ); 
00270 }
00271 
00272 #endif

Generated on Sun Oct 14 18:46:29 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001