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/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SC_INC_LOOKUPCACHE_HXX
21 #define INCLUDED_SC_INC_LOOKUPCACHE_HXX
23 #include "address.hxx"
25 #include <formula/token.hxx>
26 #include <svl/listener.hxx>
28 #include <unordered_map>
33 /** Lookup cache for one range used with interpreter functions such as VLOOKUP
34 and MATCH. Caches query for a specific row and the resulting address looked
35 up, in case other lookups of the same query in the same row are to be
36 performed, which usually occur to obtain a different offset column of the
40 class ScLookupCache
: public SvtListener
46 NOT_CACHED
, /// Query not found in cache.
47 CRITERIA_DIFFERENT
, /// Different criteria for same query position exists.
48 NOT_AVAILABLE
, /// Criteria not available in lookup range.
49 FOUND
/// Criteria found.
65 const OUString
*mpStr
;
73 if (mbAlloc
&& mbString
)
77 QueryCriteria
& operator=( const QueryCriteria
& r
) = delete;
81 explicit QueryCriteria( const ScQueryEntry
& rEntry
);
82 QueryCriteria( const QueryCriteria
& r
);
85 QueryOp
getQueryOp() const { return meOp
; }
87 void setDouble( double fVal
)
90 mbAlloc
= mbString
= false;
94 void setString( const OUString
& rStr
)
97 mbAlloc
= mbString
= true;
98 mpStr
= new OUString( rStr
);
101 bool operator==( const QueryCriteria
& r
) const
103 return meOp
== r
.meOp
&& mbString
== r
.mbString
&&
104 (mbString
? (*mpStr
== *r
.mpStr
) : (mfVal
== r
.mfVal
));
109 /// MUST be new'd because Notify() deletes.
110 ScLookupCache( ScDocument
* pDoc
, const ScRange
& rRange
);
111 virtual ~ScLookupCache() override
;
112 /// Remove from document structure and delete (!) cache on modify hint.
113 virtual void Notify( const SfxHint
& rHint
) override
;
115 /// @returns document address in o_rAddress if Result==FOUND
116 Result
lookup( ScAddress
& o_rResultAddress
,
117 const QueryCriteria
& rCriteria
,
118 const ScAddress
& rQueryAddress
) const;
120 /** Insert query and result.
122 Pass sal_False if the search didn't deliver a result. A subsequent
123 lookup() then will return Result::NOT_AVAILABLE.
124 @returns successful insertion.
126 bool insert( const ScAddress
& rResultAddress
,
127 const QueryCriteria
& rCriteria
,
128 const ScAddress
& rQueryAddress
,
129 const bool bAvailable
);
131 inline const ScRange
& getRange() const { return maRange
; }
135 size_t operator()( const ScRange
& rRange
) const
137 // Lookups are performed on the first column.
138 return rRange
.hashStartColumn();
150 QueryKey( const ScAddress
& rAddress
, const QueryOp eOp
) :
151 mnRow( rAddress
.Row()),
152 mnTab( rAddress
.Tab()),
157 bool operator==( const QueryKey
& r
) const
159 return mnRow
== r
.mnRow
&& mnTab
== r
.mnTab
&& meOp
== r
.meOp
&& meOp
!= UNKNOWN
;
164 size_t operator()( const QueryKey
& r
) const
166 return (static_cast<size_t>(r
.mnTab
) << 24) ^
167 (static_cast<size_t>(r
.meOp
) << 22) ^
168 static_cast<size_t>(r
.mnRow
);
173 struct QueryCriteriaAndResult
175 QueryCriteria maCriteria
;
178 QueryCriteriaAndResult( const QueryCriteria
& rCriteria
, const ScAddress
& rAddress
) :
179 maCriteria( rCriteria
),
183 ~QueryCriteriaAndResult()
188 typedef std::unordered_map
< QueryKey
, QueryCriteriaAndResult
, QueryKey::Hash
> QueryMap
;
193 ScLookupCache( const ScLookupCache
& ) = delete;
194 ScLookupCache
& operator=( const ScLookupCache
& ) = delete;
198 typedef std::unordered_map
< ScRange
, ScLookupCache
*, ScLookupCache::Hash
> ScLookupCacheMap
;
202 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */