Phoenix
Object-oriented orthogonally persistent operating system
utils.h
Go to the documentation of this file.
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_ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines