Workaround using unaligned loads for gcc < 9
[stockfish] / src / nnue / evaluate_nnue.h
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2020 The Stockfish developers (see AUTHORS file)
4
5   Stockfish is free software: you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation, either version 3 of the License, or
8   (at your option) any later version.
9
10   Stockfish is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 // header used in NNUE evaluation function
20
21 #ifndef NNUE_EVALUATE_NNUE_H_INCLUDED
22 #define NNUE_EVALUATE_NNUE_H_INCLUDED
23
24 #include "nnue_feature_transformer.h"
25
26 #include <memory>
27
28 namespace Eval::NNUE {
29
30   // Hash value of evaluation function structure
31   constexpr std::uint32_t kHashValue =
32       FeatureTransformer::GetHashValue() ^ Network::GetHashValue();
33
34   // Deleter for automating release of memory area
35   template <typename T>
36   struct AlignedDeleter {
37     void operator()(T* ptr) const {
38       ptr->~T();
39       std_aligned_free(ptr);
40     }
41   };
42
43   template <typename T>
44   using AlignedPtr = std::unique_ptr<T, AlignedDeleter<T>>;
45
46 }  // namespace Eval::NNUE
47
48 #endif // #ifndef NNUE_EVALUATE_NNUE_H_INCLUDED