1*8a106958SDamjan Jovanovic /************************************************************** 2*8a106958SDamjan Jovanovic * 3*8a106958SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4*8a106958SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5*8a106958SDamjan Jovanovic * distributed with this work for additional information 6*8a106958SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7*8a106958SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8*8a106958SDamjan Jovanovic * "License"); you may not use this file except in compliance 9*8a106958SDamjan Jovanovic * with the License. You may obtain a copy of the License at 10*8a106958SDamjan Jovanovic * 11*8a106958SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12*8a106958SDamjan Jovanovic * 13*8a106958SDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14*8a106958SDamjan Jovanovic * software distributed under the License is distributed on an 15*8a106958SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*8a106958SDamjan Jovanovic * KIND, either express or implied. See the License for the 17*8a106958SDamjan Jovanovic * specific language governing permissions and limitations 18*8a106958SDamjan Jovanovic * under the License. 19*8a106958SDamjan Jovanovic * 20*8a106958SDamjan Jovanovic *************************************************************/ 21*8a106958SDamjan Jovanovic 22*8a106958SDamjan Jovanovic 23*8a106958SDamjan Jovanovic 24*8a106958SDamjan Jovanovic #ifndef COSV_STRINGDATA_HXX 25*8a106958SDamjan Jovanovic #define COSV_STRINGDATA_HXX 26*8a106958SDamjan Jovanovic 27*8a106958SDamjan Jovanovic 28*8a106958SDamjan Jovanovic #include <cosv/str_types.hxx> 29*8a106958SDamjan Jovanovic #include <cstring> 30*8a106958SDamjan Jovanovic 31*8a106958SDamjan Jovanovic 32*8a106958SDamjan Jovanovic namespace csv 33*8a106958SDamjan Jovanovic { 34*8a106958SDamjan Jovanovic 35*8a106958SDamjan Jovanovic /** @tpl CHAR 36*8a106958SDamjan Jovanovic The expression CHAR(0) has to be valid. 37*8a106958SDamjan Jovanovic */ 38*8a106958SDamjan Jovanovic template <class CHAR> 39*8a106958SDamjan Jovanovic class StringData 40*8a106958SDamjan Jovanovic { 41*8a106958SDamjan Jovanovic public: 42*8a106958SDamjan Jovanovic typedef StringData self; 43*8a106958SDamjan Jovanovic 44*8a106958SDamjan Jovanovic typedef str::size size_type; 45*8a106958SDamjan Jovanovic typedef str::position position_type; 46*8a106958SDamjan Jovanovic 47*8a106958SDamjan Jovanovic // LIFECYCLE 48*8a106958SDamjan Jovanovic StringData(); 49*8a106958SDamjan Jovanovic /** @precond i_pData != 0 50*8a106958SDamjan Jovanovic @precond i_nValidLength <= strlen(i_pData) 51*8a106958SDamjan Jovanovic */ 52*8a106958SDamjan Jovanovic StringData( 53*8a106958SDamjan Jovanovic const CHAR * i_pData, 54*8a106958SDamjan Jovanovic size_type i_nValidLength ); 55*8a106958SDamjan Jovanovic ~StringData(); 56*8a106958SDamjan Jovanovic // OPERATORS 57*8a106958SDamjan Jovanovic 58*8a106958SDamjan Jovanovic // OPERATIONS 59*8a106958SDamjan Jovanovic 60*8a106958SDamjan Jovanovic // INQUIRY 61*8a106958SDamjan Jovanovic const CHAR * Data() const; 62*8a106958SDamjan Jovanovic 63*8a106958SDamjan Jovanovic /** @returns the allocated number of CHAR. 64*8a106958SDamjan Jovanovic This may be different from the number of bytes. 65*8a106958SDamjan Jovanovic There is actually allocated one more CHAR, 66*8a106958SDamjan Jovanovic which is guaranteed to be CHAR(0) in all circumstances. 67*8a106958SDamjan Jovanovic */ 68*8a106958SDamjan Jovanovic size_type Size() const; 69*8a106958SDamjan Jovanovic 70*8a106958SDamjan Jovanovic private: 71*8a106958SDamjan Jovanovic /* Because this is used only within a refcounted structure, 72*8a106958SDamjan Jovanovic these functions are forbidden - at least yet. 73*8a106958SDamjan Jovanovic */ 74*8a106958SDamjan Jovanovic StringData(const self&); 75*8a106958SDamjan Jovanovic self & operator=(const self&); 76*8a106958SDamjan Jovanovic 77*8a106958SDamjan Jovanovic // DATA 78*8a106958SDamjan Jovanovic DYN CHAR * dpData; 79*8a106958SDamjan Jovanovic size_type nSize; /// The allocated size - 1 (for the finishing 0). 80*8a106958SDamjan Jovanovic }; 81*8a106958SDamjan Jovanovic 82*8a106958SDamjan Jovanovic 83*8a106958SDamjan Jovanovic 84*8a106958SDamjan Jovanovic // IMPLEMENTATION 85*8a106958SDamjan Jovanovic 86*8a106958SDamjan Jovanovic template <class CHAR> 87*8a106958SDamjan Jovanovic StringData<CHAR>::StringData() 88*8a106958SDamjan Jovanovic : dpData( new CHAR[1] ), 89*8a106958SDamjan Jovanovic nSize(0) 90*8a106958SDamjan Jovanovic { 91*8a106958SDamjan Jovanovic *dpData = CHAR(0); 92*8a106958SDamjan Jovanovic } 93*8a106958SDamjan Jovanovic 94*8a106958SDamjan Jovanovic template <class CHAR> 95*8a106958SDamjan Jovanovic StringData<CHAR>::StringData( const CHAR * i_pData, 96*8a106958SDamjan Jovanovic size_type i_nValidLength ) 97*8a106958SDamjan Jovanovic : dpData( new CHAR[i_nValidLength + 1] ), 98*8a106958SDamjan Jovanovic nSize(i_nValidLength) 99*8a106958SDamjan Jovanovic { 100*8a106958SDamjan Jovanovic memcpy( dpData, i_pData, i_nValidLength * sizeof(CHAR) ); 101*8a106958SDamjan Jovanovic dpData[nSize] = CHAR(0); 102*8a106958SDamjan Jovanovic } 103*8a106958SDamjan Jovanovic 104*8a106958SDamjan Jovanovic template <class CHAR> 105*8a106958SDamjan Jovanovic StringData<CHAR>::~StringData() 106*8a106958SDamjan Jovanovic { 107*8a106958SDamjan Jovanovic delete [] dpData; 108*8a106958SDamjan Jovanovic } 109*8a106958SDamjan Jovanovic 110*8a106958SDamjan Jovanovic template <class CHAR> 111*8a106958SDamjan Jovanovic const CHAR * 112*8a106958SDamjan Jovanovic StringData<CHAR>::Data() const 113*8a106958SDamjan Jovanovic { 114*8a106958SDamjan Jovanovic return dpData; 115*8a106958SDamjan Jovanovic } 116*8a106958SDamjan Jovanovic 117*8a106958SDamjan Jovanovic template <class CHAR> 118*8a106958SDamjan Jovanovic typename StringData<CHAR>::size_type 119*8a106958SDamjan Jovanovic StringData<CHAR>::Size() const 120*8a106958SDamjan Jovanovic { 121*8a106958SDamjan Jovanovic return nSize; 122*8a106958SDamjan Jovanovic } 123*8a106958SDamjan Jovanovic 124*8a106958SDamjan Jovanovic 125*8a106958SDamjan Jovanovic 126*8a106958SDamjan Jovanovic } // namespace csv 127*8a106958SDamjan Jovanovic 128*8a106958SDamjan Jovanovic 129*8a106958SDamjan Jovanovic #endif 130*8a106958SDamjan Jovanovic 131*8a106958SDamjan Jovanovic 132