Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <svl/sharedstring.hxx>
11 :
12 : namespace svl {
13 :
14 1863 : SharedString SharedString::getEmptyString()
15 : {
16 : // unicode string array for empty string is globally shared in OUString.
17 : // Let's take advantage of that.
18 1863 : rtl_uString* pData = NULL;
19 1863 : rtl_uString_new(&pData);
20 1863 : return SharedString(pData, pData);
21 : }
22 :
23 164659 : SharedString::SharedString() : mpData(NULL), mpDataIgnoreCase(NULL) {}
24 :
25 186354 : SharedString::SharedString( rtl_uString* pData, rtl_uString* pDataIgnoreCase ) :
26 186354 : mpData(pData), mpDataIgnoreCase(pDataIgnoreCase)
27 : {
28 186354 : if (mpData)
29 186354 : rtl_uString_acquire(mpData);
30 186354 : if (mpDataIgnoreCase)
31 49669 : rtl_uString_acquire(mpDataIgnoreCase);
32 186354 : }
33 :
34 2088 : SharedString::SharedString( const OUString& rStr ) : mpData(rStr.pData), mpDataIgnoreCase(NULL)
35 : {
36 2088 : rtl_uString_acquire(mpData);
37 2088 : }
38 :
39 438238 : SharedString::SharedString( const SharedString& r ) : mpData(r.mpData), mpDataIgnoreCase(r.mpDataIgnoreCase)
40 : {
41 438238 : if (mpData)
42 404054 : rtl_uString_acquire(mpData);
43 438238 : if (mpDataIgnoreCase)
44 120536 : rtl_uString_acquire(mpDataIgnoreCase);
45 438238 : }
46 :
47 790487 : SharedString::~SharedString()
48 : {
49 790487 : if (mpData)
50 730607 : rtl_uString_release(mpData);
51 790487 : if (mpDataIgnoreCase)
52 173519 : rtl_uString_release(mpDataIgnoreCase);
53 790487 : }
54 :
55 142415 : SharedString& SharedString::operator= ( const SharedString& r )
56 : {
57 142415 : if (mpData)
58 3902 : rtl_uString_release(mpData);
59 142415 : if (mpDataIgnoreCase)
60 2382 : rtl_uString_release(mpDataIgnoreCase);
61 :
62 142415 : mpData = r.mpData;
63 142415 : mpDataIgnoreCase = r.mpDataIgnoreCase;
64 :
65 142415 : if (mpData)
66 142385 : rtl_uString_acquire(mpData);
67 142415 : if (mpDataIgnoreCase)
68 5700 : rtl_uString_acquire(mpDataIgnoreCase);
69 :
70 142415 : return *this;
71 : }
72 :
73 8327 : bool SharedString::operator== ( const SharedString& r ) const
74 : {
75 : // Only compare case sensitive strings.
76 8327 : if (mpData == r.mpData)
77 7079 : return true;
78 :
79 1248 : if (mpData)
80 : {
81 1248 : if (!r.mpData)
82 0 : return false;
83 :
84 1248 : if (mpData->length != r.mpData->length)
85 224 : return false;
86 :
87 1024 : return rtl_ustr_reverseCompare_WithLength(mpData->buffer, mpData->length, r.mpData->buffer, r.mpData->length) == 0;
88 : }
89 :
90 0 : return !r.mpData;
91 : }
92 :
93 3696 : bool SharedString::operator!= ( const SharedString& r ) const
94 : {
95 3696 : return !operator== (r);
96 : }
97 :
98 43963 : OUString SharedString::getString() const
99 : {
100 43963 : return mpData ? OUString(mpData) : OUString();
101 : }
102 :
103 30938 : rtl_uString* SharedString::getData()
104 : {
105 30938 : return mpData;
106 : }
107 :
108 561977 : const rtl_uString* SharedString::getData() const
109 : {
110 561977 : return mpData;
111 : }
112 :
113 1414 : rtl_uString* SharedString::getDataIgnoreCase()
114 : {
115 1414 : return mpDataIgnoreCase;
116 : }
117 :
118 286 : const rtl_uString* SharedString::getDataIgnoreCase() const
119 : {
120 286 : return mpDataIgnoreCase;
121 : }
122 :
123 24 : bool SharedString::isValid() const
124 : {
125 24 : return mpData != NULL;
126 : }
127 :
128 2259 : bool SharedString::isEmpty() const
129 : {
130 2259 : return mpData == NULL || mpData->length == 0;
131 : }
132 :
133 2430 : sal_Int32 SharedString::getLength() const
134 : {
135 2430 : return mpData ? mpData->length : 0;
136 : }
137 :
138 : }
139 :
140 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|