1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27
28 // ============================================================================
29 #include "csvsplits.hxx"
30 #include <tools/debug.hxx>
31
32 #include <algorithm>
33
34
35 // ============================================================================
36
Insert(sal_Int32 nPos)37 bool ScCsvSplits::Insert( sal_Int32 nPos )
38 {
39 bool bValid = (nPos >= 0);
40 if( bValid )
41 {
42 iterator aIter = ::std::lower_bound( maVec.begin(), maVec.end(), nPos );
43 bValid = (aIter == maVec.end()) || (*aIter != nPos);
44 if( bValid )
45 aIter = maVec.insert( aIter, nPos );
46 }
47 return bValid;
48 }
49
Remove(sal_Int32 nPos)50 bool ScCsvSplits::Remove( sal_Int32 nPos )
51 {
52 sal_uInt32 nIndex = GetIndex( nPos );
53 bool bValid = (nIndex != CSV_VEC_NOTFOUND);
54 if( bValid )
55 maVec.erase( maVec.begin() + nIndex );
56 return bValid;
57 }
58
RemoveRange(sal_Int32 nPosStart,sal_Int32 nPosEnd)59 void ScCsvSplits::RemoveRange( sal_Int32 nPosStart, sal_Int32 nPosEnd )
60 {
61 sal_uInt32 nStartIx = LowerBound( nPosStart );
62 sal_uInt32 nEndIx = UpperBound( nPosEnd );
63 if( (nStartIx != CSV_VEC_NOTFOUND) && (nEndIx != CSV_VEC_NOTFOUND) && (nStartIx <= nEndIx) )
64 maVec.erase( maVec.begin() + nStartIx, maVec.begin() + nEndIx + 1 );
65 }
66
Clear()67 void ScCsvSplits::Clear()
68 {
69 maVec.clear();
70 }
71
HasSplit(sal_Int32 nPos) const72 bool ScCsvSplits::HasSplit( sal_Int32 nPos ) const
73 {
74 return GetIndex( nPos ) != CSV_VEC_NOTFOUND;
75 }
76
77
78 // ----------------------------------------------------------------------------
79
GetIndex(sal_Int32 nPos) const80 sal_uInt32 ScCsvSplits::GetIndex( sal_Int32 nPos ) const
81 {
82 const_iterator aIter = ::std::lower_bound( maVec.begin(), maVec.end(), nPos );
83 return GetIterIndex( ((aIter != maVec.end()) && (*aIter == nPos)) ? aIter : maVec.end() );
84 }
85
LowerBound(sal_Int32 nPos) const86 sal_uInt32 ScCsvSplits::LowerBound( sal_Int32 nPos ) const
87 {
88 return GetIterIndex( ::std::lower_bound( maVec.begin(), maVec.end(), nPos ) );
89 }
90
UpperBound(sal_Int32 nPos) const91 sal_uInt32 ScCsvSplits::UpperBound( sal_Int32 nPos ) const
92 {
93 sal_uInt32 nIndex = LowerBound( nPos );
94 if( nIndex == CSV_VEC_NOTFOUND )
95 return Count() ? (Count() - 1) : CSV_VEC_NOTFOUND;
96 if( GetPos( nIndex ) == nPos )
97 return nIndex;
98 return nIndex ? (nIndex - 1) : CSV_VEC_NOTFOUND;
99 }
100
GetPos(sal_uInt32 nIndex) const101 sal_Int32 ScCsvSplits::GetPos( sal_uInt32 nIndex ) const
102 {
103 return (nIndex < Count()) ? maVec[ nIndex ] : CSV_POS_INVALID;
104 }
105
106
107 // ----------------------------------------------------------------------------
108
GetIterIndex(const_iterator aIter) const109 sal_uInt32 ScCsvSplits::GetIterIndex( const_iterator aIter ) const
110 {
111 return (aIter == maVec.end()) ? CSV_VEC_NOTFOUND : (aIter - maVec.begin());
112 }
113
114
115 // ============================================================================
116
117