--- /dev/null
+#ifndef MSP_CORE_INTTYPES_H_
+#define MSP_CORE_INTTYPES_H_
+
+#include <climits>
+#include "typelist.h"
+
+namespace Msp {
+
+// Define lists of standard types, both signed and unsigned variants
+typedef TypeList<signed char, short, int, long>::Type StandardSignedTypes;
+typedef TypeList<unsigned char, unsigned short, unsigned int, unsigned long>::Type StandardUnsignedTypes;
+
+// Then add possible nonstandard types
+#if defined(__GNUC__)
+#if (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=6)) && defined(__LP64__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-pedantic"
+typedef TypeList<StandardSignedTypes, long long, __int128>::Type PlatformSignedTypes;
+typedef TypeList<StandardUnsignedTypes, unsigned long long, unsigned __int128>::Type PlatformUnsignedTypes;
+#pragma GCC diagnostic pop
+#else
+typedef TypeList<StandardSignedTypes, long long>::Type PlatformSignedTypes;
+typedef TypeList<StandardUnsignedTypes, unsigned long long>::Type PlatformUnsignedTypes;
+#endif
+#elif defined(_MSC_VER)
+typedef TypeList<StandardSignedTypes, __int64>::Type PlatformSignedTypes;
+typedef TypeList<StandardUnsignedTypes, unsigned __int64>::Type PlatformUnsignedTypes;
+#else
+typedef StandardSignedTypes PlatformSignedTypes;
+typedef StandardUnsignedTypes PlatformUnsignedTypes;
+#endif
+
+/** A helper for choosing an integer type of a specific size. The size
+parameter is in bits. The resulting types can be obtained from the SignedType
+and UnsignedType typedefs. */
+template<unsigned size>
+struct Int
+{
+ template<typename T>
+ struct Predicate
+ {
+ enum { value = (sizeof(T)*CHAR_BIT==size) };
+ };
+
+ typedef typename TypeChooser<PlatformSignedTypes, Predicate>::Type SignedType;
+ typedef typename TypeChooser<PlatformUnsignedTypes, Predicate>::Type UnsignedType;
+};
+
+// Finally define convenient shorthands for the actual integer types
+typedef Int<8>::SignedType Int8;
+typedef Int<8>::UnsignedType UInt8;
+typedef Int<16>::SignedType Int16;
+typedef Int<16>::UnsignedType UInt16;
+typedef Int<32>::SignedType Int32;
+typedef Int<32>::UnsignedType UInt32;
+typedef Int<64>::SignedType Int64;
+typedef Int<64>::UnsignedType UInt64;
+
+} // namespace Msp
+
+#endif