/src/libreoffice/include/svl/sharedstring.hxx
Line | Count | Source |
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 | | #ifndef INCLUDED_SVL_SHAREDSTRING_HXX |
11 | | #define INCLUDED_SVL_SHAREDSTRING_HXX |
12 | | |
13 | | #include <svl/svldllapi.h> |
14 | | #include <rtl/ustring.hxx> |
15 | | |
16 | | #include <utility> |
17 | | |
18 | | namespace svl { |
19 | | |
20 | | class SVL_DLLPUBLIC SharedString |
21 | | { |
22 | | rtl_uString* mpData = nullptr; |
23 | | rtl_uString* mpDataIgnoreCase = nullptr; |
24 | | public: |
25 | | |
26 | | static const SharedString & getEmptyString(); |
27 | | static const OUString EMPTY_STRING; |
28 | | |
29 | 16.6M | SharedString() = default; |
30 | | SharedString( rtl_uString* pData, rtl_uString* pDataIgnoreCase ); |
31 | | explicit SharedString( const OUString& rStr ); |
32 | | SharedString( const SharedString& r ); |
33 | | SharedString(SharedString&& r) noexcept; |
34 | | ~SharedString(); |
35 | | |
36 | | SharedString& operator= ( const SharedString& r ); |
37 | | SharedString& operator=(SharedString&& r) noexcept; |
38 | | |
39 | | bool operator== ( const SharedString& r ) const; |
40 | | bool operator!= ( const SharedString& r ) const; |
41 | | |
42 | | const OUString & getString() const; |
43 | | const OUString & getIgnoreCaseString() const; |
44 | | |
45 | | rtl_uString* getData(); |
46 | | const rtl_uString* getData() const; |
47 | | |
48 | | rtl_uString* getDataIgnoreCase(); |
49 | | const rtl_uString* getDataIgnoreCase() const; |
50 | | |
51 | | bool isValid() const; |
52 | | bool isEmpty() const; |
53 | | |
54 | | sal_Int32 getLength() const; |
55 | | }; |
56 | | |
57 | | inline SharedString::SharedString( rtl_uString* pData, rtl_uString* pDataIgnoreCase ) : |
58 | 26.9M | mpData(pData), mpDataIgnoreCase(pDataIgnoreCase) |
59 | 26.9M | { |
60 | 26.9M | if (mpData) |
61 | 26.9M | rtl_uString_acquire(mpData); |
62 | 26.9M | if (mpDataIgnoreCase) |
63 | 11.2M | rtl_uString_acquire(mpDataIgnoreCase); |
64 | 26.9M | } |
65 | | |
66 | 316k | inline SharedString::SharedString( const OUString& rStr ) : mpData(rStr.pData) |
67 | 316k | { |
68 | 316k | rtl_uString_acquire(mpData); |
69 | 316k | } |
70 | | |
71 | 9.89M | inline SharedString::SharedString( const SharedString& r ) : mpData(r.mpData), mpDataIgnoreCase(r.mpDataIgnoreCase) |
72 | 9.89M | { |
73 | 9.89M | if (mpData) |
74 | 9.74M | rtl_uString_acquire(mpData); |
75 | 9.89M | if (mpDataIgnoreCase) |
76 | 6.59M | rtl_uString_acquire(mpDataIgnoreCase); |
77 | 9.89M | } |
78 | | |
79 | | inline SharedString::SharedString(SharedString&& r) noexcept |
80 | 11.3M | : mpData(std::exchange(r.mpData, nullptr)) |
81 | 11.3M | , mpDataIgnoreCase(std::exchange(r.mpDataIgnoreCase, nullptr)) |
82 | 11.3M | { |
83 | 11.3M | } |
84 | | |
85 | | inline SharedString::~SharedString() |
86 | 65.1M | { |
87 | 65.1M | if (mpData) |
88 | 35.2M | rtl_uString_release(mpData); |
89 | 65.1M | if (mpDataIgnoreCase) |
90 | 17.9M | rtl_uString_release(mpDataIgnoreCase); |
91 | 65.1M | } |
92 | | |
93 | | inline SharedString& SharedString::operator=(SharedString&& r) noexcept |
94 | 17.7M | { |
95 | | // Having this inline helps Calc's mdds::multi_type_vector to do some operations |
96 | | // much faster. |
97 | 17.7M | if (mpData) |
98 | 1.92M | rtl_uString_release(mpData); |
99 | 17.7M | if (mpDataIgnoreCase) |
100 | 36.0k | rtl_uString_release(mpDataIgnoreCase); |
101 | | |
102 | 17.7M | mpData = std::exchange(r.mpData, nullptr); |
103 | 17.7M | mpDataIgnoreCase = std::exchange(r.mpDataIgnoreCase, nullptr); |
104 | | |
105 | 17.7M | return *this; |
106 | 17.7M | } |
107 | | |
108 | | inline bool SharedString::operator!= ( const SharedString& r ) const |
109 | 2.35M | { |
110 | 2.35M | return !operator== (r); |
111 | 2.35M | } |
112 | | |
113 | | inline const OUString & SharedString::getString() const |
114 | 1.81M | { |
115 | 1.81M | return mpData ? OUString::unacquired(&mpData) : EMPTY_STRING; |
116 | 1.81M | } |
117 | | |
118 | | inline const OUString & SharedString::getIgnoreCaseString() const |
119 | 163 | { |
120 | 163 | return mpDataIgnoreCase ? OUString::unacquired(&mpDataIgnoreCase) : EMPTY_STRING; |
121 | 163 | } |
122 | | |
123 | | inline rtl_uString* SharedString::getData() |
124 | 5.29M | { |
125 | 5.29M | return mpData; |
126 | 5.29M | } |
127 | | |
128 | | inline const rtl_uString* SharedString::getData() const |
129 | 9.16M | { |
130 | 9.16M | return mpData; |
131 | 9.16M | } |
132 | | |
133 | | inline rtl_uString* SharedString::getDataIgnoreCase() |
134 | 3.10M | { |
135 | 3.10M | return mpDataIgnoreCase; |
136 | 3.10M | } |
137 | | |
138 | | inline const rtl_uString* SharedString::getDataIgnoreCase() const |
139 | 245k | { |
140 | 245k | return mpDataIgnoreCase; |
141 | 245k | } |
142 | | |
143 | | inline bool SharedString::isValid() const |
144 | 0 | { |
145 | 0 | return mpData != nullptr; |
146 | 0 | } |
147 | | |
148 | | inline bool SharedString::isEmpty() const |
149 | 204k | { |
150 | 204k | return mpData == nullptr || mpData->length == 0; |
151 | 204k | } |
152 | | |
153 | | inline sal_Int32 SharedString::getLength() const |
154 | 26 | { |
155 | 26 | return mpData ? mpData->length : 0; |
156 | 26 | } |
157 | | |
158 | | } |
159 | | |
160 | | #endif |
161 | | |
162 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |