Phoenix
Object-oriented orthogonally persistent operating system
|
00001 /* 00002 * /phoenix/include/utils.h 00003 * 00004 * This file is a part of Phoenix operating system. 00005 * Copyright (c) 2011-2012, Artyom Lebedev <artyom.lebedev@gmail.com> 00006 * All rights reserved. 00007 * See COPYING file for copyright details. 00008 */ 00009 00014 #ifndef COMMON_UTILS_H_ 00015 #define COMMON_UTILS_H_ 00016 00017 namespace { 00018 00020 template <typename T> 00021 inline T 00022 Min(T x, T y) { return MIN(x, y); } 00023 00025 template <typename T> 00026 inline T 00027 Max(T x, T y) { return MAX(x, y); } 00028 00030 template <typename T, typename Tal> 00031 inline T 00032 RoundUp(T size, Tal align) { return ROUND_UP(size, align); } 00033 00035 template <typename T, typename Tal> 00036 inline T 00037 RoundDown(T size, Tal align) { return ROUND_DOWN(size, align); } 00038 00040 template <typename T> 00041 inline bool 00042 IsPowerOf2(T value) { return IS_POWER_OF_2(value); } 00043 00047 template <typename T, typename Tal> 00048 inline T 00049 RoundUp2(T size, Tal align) 00050 { 00051 ASSERT(IsPowerOf2(align)); 00052 return ROUND_UP2(size, align); 00053 } 00054 00058 template <typename T, typename Tal> 00059 inline T 00060 RoundDown2(T size, Tal align) 00061 { 00062 ASSERT(IsPowerOf2(align)); 00063 return ROUND_DOWN2(size, align); 00064 } 00065 00072 template <typename T> 00073 inline T 00074 RotL(const T value, const size_t numBits) 00075 { 00076 return (value << numBits) | (value >> (sizeof(value) * NBBY - numBits)); 00077 } 00078 00085 template <typename T> 00086 inline T 00087 RotR(const T value, const size_t numBits) 00088 { 00089 return (value >> numBits) | (value << (sizeof(value) * NBBY - numBits)); 00090 } 00091 00096 template <typename T> 00097 struct UnalignedData { 00098 T value; 00099 } __PACKED; 00100 00106 template <typename T> 00107 inline T 00108 GetUnaligned(const void *p) 00109 { 00110 return static_cast<const UnalignedData<T> *>(p)->value; 00111 } 00112 00119 template <typename T> 00120 inline void 00121 PutUnaligned(T value, void *p) 00122 { 00123 static_cast<const UnalignedData<T> *>(p)->value = value; 00124 } 00125 00126 } /* Anonymous namespace */ 00127 00128 #endif /* COMMON_UTILS_H_ */