Line | Count | Source |
1 | | // Licensed to the Apache Software Foundation (ASF) under one |
2 | | // or more contributor license agreements. See the NOTICE file |
3 | | // distributed with this work for additional information |
4 | | // regarding copyright ownership. The ASF licenses this file |
5 | | // to you under the Apache License, Version 2.0 (the |
6 | | // "License"); you may not use this file except in compliance |
7 | | // with the License. You may obtain a copy of the License at |
8 | | // |
9 | | // http://www.apache.org/licenses/LICENSE-2.0 |
10 | | // |
11 | | // Unless required by applicable law or agreed to in writing, |
12 | | // software distributed under the License is distributed on an |
13 | | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
14 | | // KIND, either express or implied. See the License for the |
15 | | // specific language governing permissions and limitations |
16 | | // under the License. |
17 | | // This file is copied from |
18 | | // https://github.com/ClickHouse/ClickHouse/blob/master/base/base/unaligned.h |
19 | | // and modified by Doris |
20 | | |
21 | | #pragma once |
22 | | |
23 | | #include <cstring> |
24 | | #include <type_traits> |
25 | | |
26 | | namespace doris { |
27 | | |
28 | | template <typename T> |
29 | 5.15G | T unaligned_load(const void* address) { |
30 | 5.15G | static_assert(std::is_trivially_copyable_v<T>); |
31 | 5.15G | T res {}; |
32 | 5.15G | memcpy(&res, address, sizeof(res)); |
33 | 5.15G | return res; |
34 | 5.15G | } _ZN5doris14unaligned_loadItEET_PKv Line | Count | Source | 29 | 1.30k | T unaligned_load(const void* address) { | 30 | 1.30k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 1.30k | T res {}; | 32 | 1.30k | memcpy(&res, address, sizeof(res)); | 33 | 1.30k | return res; | 34 | 1.30k | } |
_ZN5doris14unaligned_loadIjEET_PKv Line | Count | Source | 29 | 168M | T unaligned_load(const void* address) { | 30 | 168M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 168M | T res {}; | 32 | 168M | memcpy(&res, address, sizeof(res)); | 33 | 168M | return res; | 34 | 168M | } |
_ZN5doris14unaligned_loadImEET_PKv Line | Count | Source | 29 | 4.80G | T unaligned_load(const void* address) { | 30 | 4.80G | static_assert(std::is_trivially_copyable_v<T>); | 31 | 4.80G | T res {}; | 32 | 4.80G | memcpy(&res, address, sizeof(res)); | 33 | 4.80G | return res; | 34 | 4.80G | } |
_ZN5doris14unaligned_loadIhEET_PKv Line | Count | Source | 29 | 7.74M | T unaligned_load(const void* address) { | 30 | 7.74M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 7.74M | T res {}; | 32 | 7.74M | memcpy(&res, address, sizeof(res)); | 33 | 7.74M | return res; | 34 | 7.74M | } |
_ZN5doris14unaligned_loadINS_16TimestampTzValueEEET_PKv Line | Count | Source | 29 | 424 | T unaligned_load(const void* address) { | 30 | 424 | static_assert(std::is_trivially_copyable_v<T>); | 31 | 424 | T res {}; | 32 | 424 | memcpy(&res, address, sizeof(res)); | 33 | 424 | return res; | 34 | 424 | } |
_ZN5doris14unaligned_loadINS_16VecDateTimeValueEEET_PKv Line | Count | Source | 29 | 4.28M | T unaligned_load(const void* address) { | 30 | 4.28M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 4.28M | T res {}; | 32 | 4.28M | memcpy(&res, address, sizeof(res)); | 33 | 4.28M | return res; | 34 | 4.28M | } |
_ZN5doris14unaligned_loadIfEET_PKv Line | Count | Source | 29 | 228k | T unaligned_load(const void* address) { | 30 | 228k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 228k | T res {}; | 32 | 228k | memcpy(&res, address, sizeof(res)); | 33 | 228k | return res; | 34 | 228k | } |
_ZN5doris14unaligned_loadIlEET_PKv Line | Count | Source | 29 | 90.2M | T unaligned_load(const void* address) { | 30 | 90.2M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 90.2M | T res {}; | 32 | 90.2M | memcpy(&res, address, sizeof(res)); | 33 | 90.2M | return res; | 34 | 90.2M | } |
_ZN5doris14unaligned_loadIaEET_PKv Line | Count | Source | 29 | 2.34M | T unaligned_load(const void* address) { | 30 | 2.34M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 2.34M | T res {}; | 32 | 2.34M | memcpy(&res, address, sizeof(res)); | 33 | 2.34M | return res; | 34 | 2.34M | } |
_ZN5doris14unaligned_loadIiEET_PKv Line | Count | Source | 29 | 55.8M | T unaligned_load(const void* address) { | 30 | 55.8M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 55.8M | T res {}; | 32 | 55.8M | memcpy(&res, address, sizeof(res)); | 33 | 55.8M | return res; | 34 | 55.8M | } |
_ZN5doris14unaligned_loadIdEET_PKv Line | Count | Source | 29 | 3.33M | T unaligned_load(const void* address) { | 30 | 3.33M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 3.33M | T res {}; | 32 | 3.33M | memcpy(&res, address, sizeof(res)); | 33 | 3.33M | return res; | 34 | 3.33M | } |
_ZN5doris14unaligned_loadINS_11DateV2ValueINS_15DateV2ValueTypeEEEEET_PKv Line | Count | Source | 29 | 42.1k | T unaligned_load(const void* address) { | 30 | 42.1k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 42.1k | T res {}; | 32 | 42.1k | memcpy(&res, address, sizeof(res)); | 33 | 42.1k | return res; | 34 | 42.1k | } |
_ZN5doris14unaligned_loadINS_11DateV2ValueINS_19DateTimeV2ValueTypeEEEEET_PKv Line | Count | Source | 29 | 75.5k | T unaligned_load(const void* address) { | 30 | 75.5k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 75.5k | T res {}; | 32 | 75.5k | memcpy(&res, address, sizeof(res)); | 33 | 75.5k | return res; | 34 | 75.5k | } |
_ZN5doris14unaligned_loadIoEET_PKv Line | Count | Source | 29 | 32.4k | T unaligned_load(const void* address) { | 30 | 32.4k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 32.4k | T res {}; | 32 | 32.4k | memcpy(&res, address, sizeof(res)); | 33 | 32.4k | return res; | 34 | 32.4k | } |
_ZN5doris14unaligned_loadIsEET_PKv Line | Count | Source | 29 | 65.3k | T unaligned_load(const void* address) { | 30 | 65.3k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 65.3k | T res {}; | 32 | 65.3k | memcpy(&res, address, sizeof(res)); | 33 | 65.3k | return res; | 34 | 65.3k | } |
_ZN5doris14unaligned_loadInEET_PKv Line | Count | Source | 29 | 1.41M | T unaligned_load(const void* address) { | 30 | 1.41M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 1.41M | T res {}; | 32 | 1.41M | memcpy(&res, address, sizeof(res)); | 33 | 1.41M | return res; | 34 | 1.41M | } |
_ZN5doris14unaligned_loadI10Elf64_NhdrEET_PKv Line | Count | Source | 29 | 557 | T unaligned_load(const void* address) { | 30 | 557 | static_assert(std::is_trivially_copyable_v<T>); | 31 | 557 | T res {}; | 32 | 557 | memcpy(&res, address, sizeof(res)); | 33 | 557 | return res; | 34 | 557 | } |
_ZN5doris14unaligned_loadIbEET_PKv Line | Count | Source | 29 | 1.11M | T unaligned_load(const void* address) { | 30 | 1.11M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 1.11M | T res {}; | 32 | 1.11M | memcpy(&res, address, sizeof(res)); | 33 | 1.11M | return res; | 34 | 1.11M | } |
_ZN5doris14unaligned_loadINS_12PackedInt128EEET_PKv Line | Count | Source | 29 | 4.57k | T unaligned_load(const void* address) { | 30 | 4.57k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 4.57k | T res {}; | 32 | 4.57k | memcpy(&res, address, sizeof(res)); | 33 | 4.57k | return res; | 34 | 4.57k | } |
_ZN5doris14unaligned_loadINS_13PackedUInt128EEET_PKv Line | Count | Source | 29 | 1.78k | T unaligned_load(const void* address) { | 30 | 1.78k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 1.78k | T res {}; | 32 | 1.78k | memcpy(&res, address, sizeof(res)); | 33 | 1.78k | return res; | 34 | 1.78k | } |
_ZN5doris14unaligned_loadINS_7DecimalIiEEEET_PKv Line | Count | Source | 29 | 4.80k | T unaligned_load(const void* address) { | 30 | 4.80k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 4.80k | T res {}; | 32 | 4.80k | memcpy(&res, address, sizeof(res)); | 33 | 4.80k | return res; | 34 | 4.80k | } |
_ZN5doris14unaligned_loadINS_7DecimalIlEEEET_PKv Line | Count | Source | 29 | 6.80M | T unaligned_load(const void* address) { | 30 | 6.80M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 6.80M | T res {}; | 32 | 6.80M | memcpy(&res, address, sizeof(res)); | 33 | 6.80M | return res; | 34 | 6.80M | } |
_ZN5doris14unaligned_loadINS_14DecimalV2ValueEEET_PKv Line | Count | Source | 29 | 4.71k | T unaligned_load(const void* address) { | 30 | 4.71k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 4.71k | T res {}; | 32 | 4.71k | memcpy(&res, address, sizeof(res)); | 33 | 4.71k | return res; | 34 | 4.71k | } |
_ZN5doris14unaligned_loadINS_12Decimal128V3EEET_PKv Line | Count | Source | 29 | 7.99k | T unaligned_load(const void* address) { | 30 | 7.99k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 7.99k | T res {}; | 32 | 7.99k | memcpy(&res, address, sizeof(res)); | 33 | 7.99k | return res; | 34 | 7.99k | } |
_ZN5doris14unaligned_loadINS_7DecimalIN4wide7integerILm256EiEEEEEET_PKv Line | Count | Source | 29 | 6.34k | T unaligned_load(const void* address) { | 30 | 6.34k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 6.34k | T res {}; | 32 | 6.34k | memcpy(&res, address, sizeof(res)); | 33 | 6.34k | return res; | 34 | 6.34k | } |
_ZN5doris14unaligned_loadINS_7DecimalInEEEET_PKv Line | Count | Source | 29 | 1.51k | T unaligned_load(const void* address) { | 30 | 1.51k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 1.51k | T res {}; | 32 | 1.51k | memcpy(&res, address, sizeof(res)); | 33 | 1.51k | return res; | 34 | 1.51k | } |
_ZN5doris14unaligned_loadIN4wide7integerILm256EiEEEET_PKv Line | Count | Source | 29 | 3.49k | T unaligned_load(const void* address) { | 30 | 3.49k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 3.49k | T res {}; | 32 | 3.49k | memcpy(&res, address, sizeof(res)); | 33 | 3.49k | return res; | 34 | 3.49k | } |
_ZN5doris14unaligned_loadINS_21ParquetInt96TimestampEEET_PKv Line | Count | Source | 29 | 967k | T unaligned_load(const void* address) { | 30 | 967k | static_assert(std::is_trivially_copyable_v<T>); | 31 | 967k | T res {}; | 32 | 967k | memcpy(&res, address, sizeof(res)); | 33 | 967k | return res; | 34 | 967k | } |
_ZN5doris14unaligned_loadINS_9StringRefEEET_PKv Line | Count | Source | 29 | 3.51M | T unaligned_load(const void* address) { | 30 | 3.51M | static_assert(std::is_trivially_copyable_v<T>); | 31 | 3.51M | T res {}; | 32 | 3.51M | memcpy(&res, address, sizeof(res)); | 33 | 3.51M | return res; | 34 | 3.51M | } |
_ZN5doris14unaligned_loadINS_8uint24_tEEET_PKv Line | Count | Source | 29 | 704 | T unaligned_load(const void* address) { | 30 | 704 | static_assert(std::is_trivially_copyable_v<T>); | 31 | 704 | T res {}; | 32 | 704 | memcpy(&res, address, sizeof(res)); | 33 | 704 | return res; | 34 | 704 | } |
_ZN5doris14unaligned_loadINS_11decimal12_tEEET_PKv Line | Count | Source | 29 | 438 | T unaligned_load(const void* address) { | 30 | 438 | static_assert(std::is_trivially_copyable_v<T>); | 31 | 438 | T res {}; | 32 | 438 | memcpy(&res, address, sizeof(res)); | 33 | 438 | return res; | 34 | 438 | } |
|
35 | | |
36 | | /// We've had troubles before with wrong store size due to integral promotions |
37 | | /// (e.g., unaligned_store(dest, uint16_t + uint16_t) stores an uint32_t). |
38 | | /// To prevent this, make the caller specify the stored type explicitly. |
39 | | /// To disable deduction of T, wrap the argument type with std::enable_if. |
40 | | template <typename T> |
41 | 4.27M | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { |
42 | 4.27M | static_assert(std::is_trivially_copyable_v<T>); |
43 | 4.27M | memcpy(address, &src, sizeof(src)); |
44 | 4.27M | } _ZN5doris15unaligned_storeItEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 25.6k | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 25.6k | static_assert(std::is_trivially_copyable_v<T>); | 43 | 25.6k | memcpy(address, &src, sizeof(src)); | 44 | 25.6k | } |
_ZN5doris15unaligned_storeIjEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 46.2k | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 46.2k | static_assert(std::is_trivially_copyable_v<T>); | 43 | 46.2k | memcpy(address, &src, sizeof(src)); | 44 | 46.2k | } |
_ZN5doris15unaligned_storeImEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 2.93M | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 2.93M | static_assert(std::is_trivially_copyable_v<T>); | 43 | 2.93M | memcpy(address, &src, sizeof(src)); | 44 | 2.93M | } |
_ZN5doris15unaligned_storeIbEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 1.11M | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 1.11M | static_assert(std::is_trivially_copyable_v<T>); | 43 | 1.11M | memcpy(address, &src, sizeof(src)); | 44 | 1.11M | } |
_ZN5doris15unaligned_storeIiEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 14.7k | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 14.7k | static_assert(std::is_trivially_copyable_v<T>); | 43 | 14.7k | memcpy(address, &src, sizeof(src)); | 44 | 14.7k | } |
_ZN5doris15unaligned_storeIfEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 100k | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 100k | static_assert(std::is_trivially_copyable_v<T>); | 43 | 100k | memcpy(address, &src, sizeof(src)); | 44 | 100k | } |
_ZN5doris15unaligned_storeIdEEvPvRKNSt9enable_ifILb1ET_E4typeE Line | Count | Source | 41 | 34.8k | void unaligned_store(void* address, const typename std::enable_if<true, T>::type& src) { | 42 | 34.8k | static_assert(std::is_trivially_copyable_v<T>); | 43 | 34.8k | memcpy(address, &src, sizeof(src)); | 44 | 34.8k | } |
|
45 | | } // namespace doris |