/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* @author Tudor Bosman (tudorb@fb.com)
*/
-#ifndef FOLLY_BITS_H_
-#define FOLLY_BITS_H_
+#pragma once
#if !defined(__clang__) && !(defined(_MSC_VER) && (_MSC_VER < 1900))
#define FOLLY_INTRINSIC_CONSTEXPR constexpr
inline T loadUnaligned(const void* p) {
static_assert(sizeof(Unaligned<T>) == sizeof(T), "Invalid unaligned size");
static_assert(alignof(Unaligned<T>) == 1, "Invalid alignment");
- return static_cast<const Unaligned<T>*>(p)->value;
+ if (kHasUnalignedAccess) {
+ return static_cast<const Unaligned<T>*>(p)->value;
+ } else {
+ T value;
+ memcpy(&value, p, sizeof(T));
+ return value;
+ }
}
/**
inline void storeUnaligned(void* p, T value) {
static_assert(sizeof(Unaligned<T>) == sizeof(T), "Invalid unaligned size");
static_assert(alignof(Unaligned<T>) == 1, "Invalid alignment");
- new (p) Unaligned<T>(value);
+ if (kHasUnalignedAccess) {
+ new (p) Unaligned<T>(value);
+ } else {
+ memcpy(p, &value, sizeof(T));
+ }
}
} // namespace folly
-
-#endif /* FOLLY_BITS_H_ */