bump product version to 6.3.0.0.beta1
[LibreOffice.git] / connectivity / source / commontools / TSortIndex.cxx
blob0658c517a07dc19a0fa747119af9d2265f78e066
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 #include <TSortIndex.hxx>
21 #include <algorithm>
22 #include <iterator>
23 #include <o3tl/functional.hxx>
25 using namespace connectivity;
27 /// Functor object for class OSortIndex::TIntValuePairVector::value_type returntype is bool
28 struct TKeyValueFunc
30 OSortIndex* pIndex;
32 explicit TKeyValueFunc(OSortIndex* _pIndex) : pIndex(_pIndex)
35 // return false if compared values are equal otherwise true
36 bool operator()(const OSortIndex::TIntValuePairVector::value_type& lhs,const OSortIndex::TIntValuePairVector::value_type& rhs) const
38 const std::vector<OKeyType>& aKeyType = pIndex->getKeyType();
39 size_t i = 0;
40 for (auto const& elem : aKeyType)
42 const bool bGreater = pIndex->getAscending(i) != TAscendingOrder::ASC;
43 const bool bLess = !bGreater;
45 // compare depending for type
46 switch (elem)
48 case OKeyType::String:
50 sal_Int32 nRes = lhs.second->getKeyString(i).compareTo(rhs.second->getKeyString(i));
51 if (nRes < 0)
52 return bLess;
53 else if (nRes > 0)
54 return bGreater;
56 break;
57 case OKeyType::Double:
59 double d1 = lhs.second->getKeyDouble(i);
60 double d2 = rhs.second->getKeyDouble(i);
62 if (d1 < d2)
63 return bLess;
64 else if (d1 > d2)
65 return bGreater;
67 break;
68 case OKeyType::NONE:
69 break;
71 ++i;
74 // know we know that the values are equal
75 return false;
80 ::rtl::Reference<OKeySet> OSortIndex::CreateKeySet()
82 Freeze();
84 ::rtl::Reference<OKeySet> pKeySet = new OKeySet();
85 pKeySet->get().reserve(m_aKeyValues.size());
86 std::transform(m_aKeyValues.begin()
87 ,m_aKeyValues.end()
88 ,std::back_inserter(pKeySet->get())
89 ,::o3tl::select1st<TIntValuePairVector::value_type>());
90 pKeySet->setFrozen();
91 return pKeySet;
94 OSortIndex::OSortIndex( const std::vector<OKeyType>& _aKeyType,
95 const std::vector<TAscendingOrder>& _aAscending)
96 :m_aKeyType(_aKeyType)
97 ,m_aAscending(_aAscending)
98 ,m_bFrozen(false)
102 OSortIndex::~OSortIndex()
106 void OSortIndex::AddKeyValue(std::unique_ptr<OKeyValue> pKeyValue)
108 assert(pKeyValue && "Can not be null here!");
109 if(m_bFrozen)
111 m_aKeyValues.push_back({pKeyValue->getValue(),nullptr});
113 else
114 m_aKeyValues.push_back({pKeyValue->getValue(),std::move(pKeyValue)});
117 void OSortIndex::Freeze()
119 OSL_ENSURE(! m_bFrozen,"OSortIndex::Freeze: already frozen!");
120 // sorting:
121 if (m_aKeyType[0] != OKeyType::NONE)
122 // we will sort ourself when the first keyType say so
123 std::sort(m_aKeyValues.begin(),m_aKeyValues.end(),TKeyValueFunc(this));
125 for (auto & keyValue : m_aKeyValues)
127 keyValue.second.reset();
130 m_bFrozen = true;
134 OKeyValue::OKeyValue(sal_Int32 nVal)
135 : m_nValue(nVal)
139 OKeyValue::~OKeyValue()
143 std::unique_ptr<OKeyValue> OKeyValue::createKeyValue(sal_Int32 _nVal)
145 return std::unique_ptr<OKeyValue>(new OKeyValue(_nVal));
149 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */