Попробуйте этот сложный фильтр:
<quer:filtering xmlns:quer="http://www.taleo.com/ws/integration/query">
<quer:greaterThan>
<quer:field path="AcceptedDate"/>
<quer:castAsDate>
<quer:addDays>
<quer:date type="now"/>
<quer:integer>-7</quer:integer>
</quer:addDays>
</quer:castAsDate>
</quer:greaterThan>
</quer:filtering>
uint32_t FourCC = *((uint32_t*)"blah");
Why not this?
EDIT: int -> uint32_t.
And no it does not cast a char** to uint32_t. It casts a (char*) to (uint32_t*) then dereferences the (uint32_t*). There is no endian-ness involved, since its assigning an uint32_tto an uint32_t. The only defects are the alignment and the I hadn't explicitly indicated a 32bit type.
Вы можете сделать его постоянной времени компиляции, используя:
template <int a, int b, int c, int d>
struct FourCC
{
static const unsigned int value = (((((d << 8) | c) << 8) | b) << 8) | a;
};
unsigned int id(FourCC<'a', 'b', 'c', 'd'>::value);
С небольшим дополнительным усилием, вы можете проверить во время компиляции, что каждое переданное число находится между 0 и 255.
или сделайте то же самое с помощью встроенной функции
inline uint32_t FOURCC(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
{
return ( (uint32) (((d)<<24) | (uint32_t(c)<<16) | (uint32_t(b)<<8) | uint32_t(a)) )
}
и избегайте головной боли макроса, но в остальном ваш подход мне подходит.
Вместо #define я бы, вероятно, поместил почти такой же код и использовал бы встроенный компилятор.
Если я не ошибаюсь, вы можете просто использовать многозначные символьные константы для этого права?
unsigned int fourCC = 'blah';
Это совершенно верно в спецификации ANSI / ISO, хотя некоторые компиляторы будут немного жаловаться. Вот как типы ресурсов использовались в старых API Macintosh.
Если постоянная времени компиляции не требуется, возможно, самая последняя из них -
unsigned int FourCCStr(const char (&tag)[5])
{
return (((((tag[3] << 8 ) | tag[2]) << 8) | tag[1]) << 8) | tag[0];
}
#define FOURCC(tag) FourCCStr(#tag)
unsigned int id(FOURCC(blah));
. Принимает только теги из четырех символов, как требуется.
Я не вижу ничего плохого в вашем алгоритме. Но для чего-то подобного я бы просто написал функцию вместо макроса. Макросы имеют множество скрытых функций / проблем, которые могут со временем вас укусить.
uint FourCC(char a, char b, char c, char d) {
return ( (uint32) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)) );
}
Предполагая Windows (поскольку FOURCC является концепцией Windows), Win API уже предоставляет mmioStringToFOURCC и mmioFOURCC .
uint32 fcc(char * a)
{
if( strlen(a) != 4)
return 0; //Unknown or unspecified format
return
(
(uint32)
(
((*(a+3))<<24) |
((*(a+2))<<16) |
((*(a+1))<<8) |
(*a)
)
);
}