1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
10 #ifndef INCLUDED_SC_INC_FSTALGORITHM_HXX
11 #define INCLUDED_SC_INC_FSTALGORITHM_HXX
13 #include <mdds/flat_segment_tree.hpp>
18 template<typename _Key
, typename _Span
>
20 std::vector
<_Span
>& rSpans
,
21 typename
mdds::flat_segment_tree
<_Key
,bool>::const_iterator it
,
22 typename
mdds::flat_segment_tree
<_Key
,bool>::const_iterator itEnd
, const _Key
* pStart
)
24 _Key nLastPos
= it
->first
;
25 bool bLastVal
= it
->second
;
26 for (++it
; it
!= itEnd
; ++it
)
28 _Key nThisPos
= it
->first
;
29 bool bThisVal
= it
->second
;
33 _Key nIndex1
= nLastPos
;
34 _Key nIndex2
= nThisPos
-1;
36 if (!pStart
|| *pStart
< nIndex1
)
37 rSpans
.push_back(_Span(nIndex1
, nIndex2
));
38 else if (*pStart
<= nIndex2
)
39 rSpans
.push_back(_Span(*pStart
, nIndex2
));
47 template<typename _Key
, typename _Val
, typename _Span
>
48 void buildSpanWithValue(
49 std::vector
<_Span
>& rSpans
,
50 typename
mdds::flat_segment_tree
<_Key
,_Val
>::const_iterator it
,
51 typename
mdds::flat_segment_tree
<_Key
,_Val
>::const_iterator itEnd
, const _Key
* pStart
)
53 _Key nLastPos
= it
->first
;
54 _Val nLastVal
= it
->second
;
55 for (++it
; it
!= itEnd
; ++it
)
57 _Key nThisPos
= it
->first
;
58 _Val nThisVal
= it
->second
;
62 _Key nIndex1
= nLastPos
;
63 _Key nIndex2
= nThisPos
-1;
65 if (!pStart
|| *pStart
< nIndex1
)
66 rSpans
.push_back(_Span(nIndex1
, nIndex2
, nLastVal
));
67 else if (*pStart
<= nIndex2
)
68 rSpans
.push_back(_Span(*pStart
, nIndex2
, nLastVal
));
77 * Convert a flat_segment_tree structure whose value type is boolean, into
78 * an array of ranges that corresponds with the segments that have a 'true'
81 template<typename _Key
, typename _Span
>
82 std::vector
<_Span
> toSpanArray( const mdds::flat_segment_tree
<_Key
,bool>& rTree
)
84 typedef mdds::flat_segment_tree
<_Key
,bool> FstType
;
86 std::vector
<_Span
> aSpans
;
88 typename
FstType::const_iterator it
= rTree
.begin(), itEnd
= rTree
.end();
89 buildSpan
<_Key
,_Span
>(aSpans
, it
, itEnd
, NULL
);
94 * Convert a flat_segment_tree structure into an array of ranges with
95 * values. Only those ranges whose value is evaluated to be true will be
96 * included. The value type must be something that supports bool operator.
97 * The span type must support a constructor that takes a start key, an end
98 * key and a value in this order.
100 template<typename _Key
, typename _Val
, typename _Span
>
101 std::vector
<_Span
> toSpanArrayWithValue( const mdds::flat_segment_tree
<_Key
,_Val
>& rTree
)
103 typedef mdds::flat_segment_tree
<_Key
,_Val
> FstType
;
105 std::vector
<_Span
> aSpans
;
107 typename
FstType::const_iterator it
= rTree
.begin(), itEnd
= rTree
.end();
108 buildSpanWithValue
<_Key
,_Val
,_Span
>(aSpans
, it
, itEnd
, NULL
);
112 template<typename _Key
, typename _Span
>
113 std::vector
<_Span
> toSpanArray( const mdds::flat_segment_tree
<_Key
,bool>& rTree
, _Key nStartPos
)
115 typedef mdds::flat_segment_tree
<_Key
,bool> FstType
;
117 std::vector
<_Span
> aSpans
;
118 if (!rTree
.is_tree_valid())
121 bool bThisVal
= false;
122 std::pair
<typename
FstType::const_iterator
, bool> r
=
123 rTree
.search_tree(nStartPos
, bThisVal
);
126 // Tree search failed.
129 typename
FstType::const_iterator it
= r
.first
, itEnd
= rTree
.end();
130 buildSpan
<_Key
,_Span
>(aSpans
, it
, itEnd
, &nStartPos
);
138 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */