Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
DoKLocalMatrixIndexer.h
1/*
2 * Copyright 2020 IFPEN-CEA
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * SPDX-License-Identifier: Apache-2.0
17 */
18
19#pragma once
20
21#include <algorithm>
22#include <unordered_map>
23
24#include <alien/utils/Precomp.h>
25
26#include <alien/kernels/dok/ILocalMatrixIndexer.h>
27
28namespace Alien
29{
30
31class IReverseIndexer;
32
34class ALIEN_EXPORT DoKLocalMatrixIndexer : public ILocalMatrixIndexer
35{
36 public:
37 DoKLocalMatrixIndexer() = default;
38 virtual ~DoKLocalMatrixIndexer() = default;
39
40 DoKLocalMatrixIndexer(const DoKLocalMatrixIndexer& src) = default;
41 DoKLocalMatrixIndexer(DoKLocalMatrixIndexer&& src) = default;
42
43 DoKLocalMatrixIndexer& operator=(const DoKLocalMatrixIndexer& src) = default;
44 DoKLocalMatrixIndexer& operator=(DoKLocalMatrixIndexer&& src) = default;
45
46 void associate(Integer i, Integer j, Offset offset) override;
47 std::optional<Offset> find(Integer i, Integer j) override;
48 Offset create(Integer i, Integer j, Offset& tentative_offset) override;
49
50 IReverseIndexer* sort(Arccore::Array<Renumbering>& perm) override;
51
52 ILocalMatrixIndexer* clone() const override;
53
54 private:
55 class HashKey
56 {
57 public:
58 HashKey() = default;
59 ~HashKey() = default;
60
61 size_t operator()(const Key& k) const
62 {
63 size_t seed = 42;
64 std::hash<Integer> h;
65 // Magic numbers from boost::hash_combine
66 seed ^= h(k.first) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
67 seed ^= h(k.second) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
68 return seed;
69 }
70 };
71 typedef std::unordered_map<Key, Offset, HashKey> HashTable;
72 HashTable m_data;
73};
74
75} // namespace Alien
void associate(Integer i, Integer j, Offset offset) override
IReverseIndexer * sort(Arccore::Array< Renumbering > &perm) override
std::optional< Offset > find(Integer i, Integer j) override
Offset create(Integer i, Integer j, Offset &tentative_offset) override
Reverse indexer: associates an Index (i,j) to an offset.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17