summaryrefslogtreecommitdiff
path: root/src/cmd_helper.h
diff options
context:
space:
mode:
authortron <tron@openttd.org>2007-02-24 09:42:39 +0000
committertron <tron@openttd.org>2007-02-24 09:42:39 +0000
commitd3b29bcacb4589922a3afc85cf648609b49679dc (patch)
treecfdc363aade39ceff0da3ef6b20dbd7e95b49c83 /src/cmd_helper.h
parent1d1121f85a975a6b9ed8305c154fc39f4f5db7fd (diff)
downloadopenttd-d3b29bcacb4589922a3afc85cf648609b49679dc.tar.xz
(svn r8876) -Fix
Replace tests with magic numbers by a simple extraction template for command parameters
Diffstat (limited to 'src/cmd_helper.h')
-rw-r--r--src/cmd_helper.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/cmd_helper.h b/src/cmd_helper.h
new file mode 100644
index 000000000..115b0e1cf
--- /dev/null
+++ b/src/cmd_helper.h
@@ -0,0 +1,28 @@
+/* $Id$ */
+
+#ifndef CMD_HELPER_H
+#define CMD_HELPER_H
+
+#include "direction.h"
+#include "macros.h"
+#include "road.h"
+
+
+template<uint N> static inline void ExtractValid();
+template<> static inline void ExtractValid<1>() {}
+
+
+template<typename T> struct ExtractBits;
+template<> struct ExtractBits<Axis> { static const uint Count = 1; };
+template<> struct ExtractBits<DiagDirection> { static const uint Count = 2; };
+template<> struct ExtractBits<RoadBits> { static const uint Count = 4; };
+
+
+template<typename T, uint N, typename U> static inline T Extract(U v)
+{
+ // Check if there are enough bits in v
+ ExtractValid<N + ExtractBits<T>::Count <= sizeof(U) * 8>();
+ return (T)GB(v, N, ExtractBits<T>::Count);
+}
+
+#endif