/*
- * 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
#undef FB_GEN
-#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-
template <class T>
-struct EndianInt : public detail::EndianIntBase<T> {
+struct EndianInt : public EndianIntBase<T> {
public:
- static T big(T x) { return EndianInt::swap(x); }
- static T little(T x) { return x; }
-};
-
-#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-
-template <class T>
-struct EndianInt : public detail::EndianIntBase<T> {
- public:
- static T big(T x) { return x; }
- static T little(T x) { return EndianInt::swap(x); }
+ static T big(T x) {
+ return kIsLittleEndian ? EndianInt::swap(x) : x;
+ }
+ static T little(T x) {
+ return kIsBigEndian ? EndianInt::swap(x) : x;
+ }
};
-#else
-# error Your machine uses a weird endianness!
-#endif /* __BYTE_ORDER__ */
-
} // namespace detail
// big* convert between native and big-endian representations
BIG
};
- static constexpr Order order =
-#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
- Order::LITTLE;
-#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
- Order::BIG;
-#else
-# error Your machine uses a weird endianness!
-#endif /* __BYTE_ORDER__ */
+ static constexpr Order order = kIsLittleEndian ? Order::LITTLE : Order::BIG;
template <class T> static T swap(T x) {
- return detail::EndianInt<T>::swap(x);
+ return folly::detail::EndianInt<T>::swap(x);
}
template <class T> static T big(T x) {
- return detail::EndianInt<T>::big(x);
+ return folly::detail::EndianInt<T>::big(x);
}
template <class T> static T little(T x) {
- return detail::EndianInt<T>::little(x);
+ return folly::detail::EndianInt<T>::little(x);
}
#if !defined(__ANDROID__)
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_ */