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