src/cmd_helper.h
author rubidium
Sat, 17 Nov 2007 12:42:15 +0000
changeset 7898 7c6a9c9030b5
parent 6134 871305fd9ab7
child 8100 6bc08f98ec16
permissions -rw-r--r--
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
6134
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     1
/* $Id$ */
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     2
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     3
#ifndef CMD_HELPER_H
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     4
#define CMD_HELPER_H
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     5
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     6
#include "direction.h"
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     7
#include "macros.h"
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     8
#include "road.h"
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
     9
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    10
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    11
template<uint N> static inline void ExtractValid();
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    12
template<> static inline void ExtractValid<1>() {}
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    13
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    14
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    15
template<typename T> struct ExtractBits;
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    16
template<> struct ExtractBits<Axis>          { static const uint Count =  1; };
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    17
template<> struct ExtractBits<DiagDirection> { static const uint Count =  2; };
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    18
template<> struct ExtractBits<RoadBits>      { static const uint Count =  4; };
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    19
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    20
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    21
template<typename T, uint N, typename U> static inline T Extract(U v)
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    22
{
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    23
	// Check if there are enough bits in v
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    24
	ExtractValid<N + ExtractBits<T>::Count <= sizeof(U) * 8>();
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    25
	return (T)GB(v, N, ExtractBits<T>::Count);
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    26
}
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    27
871305fd9ab7 (svn r8876) -Fix
tron
parents:
diff changeset
    28
#endif