tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

unaligned_access.h (2561B)


      1 //
      2 // Copyright 2017 The Abseil Authors.
      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 //      https://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 
     17 #ifndef ABSL_BASE_INTERNAL_UNALIGNED_ACCESS_H_
     18 #define ABSL_BASE_INTERNAL_UNALIGNED_ACCESS_H_
     19 
     20 #include <string.h>
     21 
     22 #include <cstdint>
     23 
     24 #include "absl/base/attributes.h"
     25 #include "absl/base/config.h"
     26 #include "absl/base/nullability.h"
     27 
     28 // unaligned APIs
     29 
     30 // Portable handling of unaligned loads, stores, and copies.
     31 
     32 // The unaligned API is C++ only.  The declarations use C++ features
     33 // (namespaces, inline) which are absent or incompatible in C.
     34 #if defined(__cplusplus)
     35 namespace absl {
     36 ABSL_NAMESPACE_BEGIN
     37 namespace base_internal {
     38 
     39 inline uint16_t UnalignedLoad16(absl::Nonnull<const void *> p) {
     40  uint16_t t;
     41  memcpy(&t, p, sizeof t);
     42  return t;
     43 }
     44 
     45 inline uint32_t UnalignedLoad32(absl::Nonnull<const void *> p) {
     46  uint32_t t;
     47  memcpy(&t, p, sizeof t);
     48  return t;
     49 }
     50 
     51 inline uint64_t UnalignedLoad64(absl::Nonnull<const void *> p) {
     52  uint64_t t;
     53  memcpy(&t, p, sizeof t);
     54  return t;
     55 }
     56 
     57 inline void UnalignedStore16(absl::Nonnull<void *> p, uint16_t v) {
     58  memcpy(p, &v, sizeof v);
     59 }
     60 
     61 inline void UnalignedStore32(absl::Nonnull<void *> p, uint32_t v) {
     62  memcpy(p, &v, sizeof v);
     63 }
     64 
     65 inline void UnalignedStore64(absl::Nonnull<void *> p, uint64_t v) {
     66  memcpy(p, &v, sizeof v);
     67 }
     68 
     69 }  // namespace base_internal
     70 ABSL_NAMESPACE_END
     71 }  // namespace absl
     72 
     73 #define ABSL_INTERNAL_UNALIGNED_LOAD16(_p) \
     74  (absl::base_internal::UnalignedLoad16(_p))
     75 #define ABSL_INTERNAL_UNALIGNED_LOAD32(_p) \
     76  (absl::base_internal::UnalignedLoad32(_p))
     77 #define ABSL_INTERNAL_UNALIGNED_LOAD64(_p) \
     78  (absl::base_internal::UnalignedLoad64(_p))
     79 
     80 #define ABSL_INTERNAL_UNALIGNED_STORE16(_p, _val) \
     81  (absl::base_internal::UnalignedStore16(_p, _val))
     82 #define ABSL_INTERNAL_UNALIGNED_STORE32(_p, _val) \
     83  (absl::base_internal::UnalignedStore32(_p, _val))
     84 #define ABSL_INTERNAL_UNALIGNED_STORE64(_p, _val) \
     85  (absl::base_internal::UnalignedStore64(_p, _val))
     86 
     87 #endif  // defined(__cplusplus), end of unaligned API
     88 
     89 #endif  // ABSL_BASE_INTERNAL_UNALIGNED_ACCESS_H_