1f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com#pragma once
2f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
3f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com#include "Platform.h"
4f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
5f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com#include <vector>
6f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
7f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//-----------------------------------------------------------------------------
8f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
9f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     printbits   ( const void * blob, int len );
10f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     printhex32  ( const void * blob, int len );
11f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     printbytes  ( const void * blob, int len );
12f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     printbytes2 ( const void * blob, int len );
13f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
14f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t popcount    ( uint32_t v );
15f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t parity      ( uint32_t v );
16f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
17f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t getbit      ( const void * blob, int len, uint32_t bit );
18f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t getbit_wrap ( const void * blob, int len, uint32_t bit );
19f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
20f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     setbit      ( void * blob, int len, uint32_t bit );
21f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     setbit      ( void * blob, int len, uint32_t bit, uint32_t val );
22f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
23f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     clearbit    ( void * blob, int len, uint32_t bit );
24f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
25f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     flipbit     ( void * blob, int len, uint32_t bit );
26f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
27f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comint      countbits   ( uint32_t v );
28f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comint      countbits   ( std::vector<uint32_t> & v );
29f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
30f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comint      countbits   ( const void * blob, int len );
31f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
32f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid     invert      ( std::vector<uint32_t> & v );
33f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
34f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//----------
35f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
36f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate< typename T >
37f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline uint32_t getbit ( T & blob, uint32_t bit )
38f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
39f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  return getbit(&blob,sizeof(blob),bit);
40f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
41f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
42f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline uint32_t getbit ( uint32_t & blob, uint32_t bit ) { return (blob >> (bit & 31)) & 1; }
43f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline uint32_t getbit ( uint64_t & blob, uint32_t bit ) { return (blob >> (bit & 63)) & 1; }
44f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
45f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//----------
46f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
47f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate< typename T >
48f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void setbit ( T & blob, uint32_t bit )
49f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
50f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  return setbit(&blob,sizeof(blob),bit);
51f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
52f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
53f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void setbit ( uint32_t & blob, uint32_t bit ) { blob |= uint32_t(1) << (bit & 31); }
54f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void setbit ( uint64_t & blob, uint32_t bit ) { blob |= uint64_t(1) << (bit & 63); }
55f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
56f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//----------
57f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
58f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate< typename T >
59f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void flipbit ( T & blob, uint32_t bit )
60f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
61f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  flipbit(&blob,sizeof(blob),bit);
62f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
63f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
64f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void flipbit ( uint32_t & blob, uint32_t bit ) { bit &= 31; blob ^= (uint32_t(1) << bit); }
65f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void flipbit ( uint64_t & blob, uint32_t bit ) { bit &= 63; blob ^= (uint64_t(1) << bit); }
66f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
67f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//-----------------------------------------------------------------------------
68f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com// Left and right shift of blobs. The shift(N) versions work on chunks of N
69f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com// bits at a time (faster)
70f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
71f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid lshift1  ( void * blob, int len, int c );
72f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid lshift8  ( void * blob, int len, int c );
73f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid lshift32 ( void * blob, int len, int c );
74f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
75f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid rshift1  ( void * blob, int len, int c );
76f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid rshift8  ( void * blob, int len, int c );
77f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid rshift32 ( void * blob, int len, int c );
78f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
79f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void lshift ( void * blob, int len, int c )
80f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
81f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((len & 3) == 0)
82f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
83f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    lshift32(blob,len,c);
84f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
85f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
86f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
87f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    lshift8(blob,len,c);
88f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
89f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
90f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
91f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void rshift ( void * blob, int len, int c )
92f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
93f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((len & 3) == 0)
94f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
95f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    rshift32(blob,len,c);
96f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
97f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
98f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
99f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    rshift8(blob,len,c);
100f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
101f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
102f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
103f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate < typename T >
104f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void lshift ( T & blob, int c )
105f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
106f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((sizeof(T) & 3) == 0)
107f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
108f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    lshift32(&blob,sizeof(T),c);
109f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
110f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
111f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
112f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    lshift8(&blob,sizeof(T),c);
113f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
114f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
115f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
116f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate < typename T >
117f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void rshift ( T & blob, int c )
118f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
119f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((sizeof(T) & 3) == 0)
120f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
121f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    lshift32(&blob,sizeof(T),c);
122f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
123f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
124f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
125f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    lshift8(&blob,sizeof(T),c);
126f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
127f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
128f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
129f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void lshift ( uint32_t & blob, int c ) { blob <<= c; }
130f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void lshift ( uint64_t & blob, int c ) { blob <<= c; }
131f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void rshift ( uint32_t & blob, int c ) { blob >>= c; }
132f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void rshift ( uint64_t & blob, int c ) { blob >>= c; }
133f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
134f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//-----------------------------------------------------------------------------
135f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com// Left and right rotate of blobs. The rot(N) versions work on chunks of N
136f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com// bits at a time (faster)
137f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
138f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid lrot1    ( void * blob, int len, int c );
139f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid lrot8    ( void * blob, int len, int c );
140f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid lrot32   ( void * blob, int len, int c );
141f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
142f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid rrot1    ( void * blob, int len, int c );
143f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid rrot8    ( void * blob, int len, int c );
144f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comvoid rrot32   ( void * blob, int len, int c );
145f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
146f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void lrot ( void * blob, int len, int c )
147f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
148f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((len & 3) == 0)
149f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
150f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return lrot32(blob,len,c);
151f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
152f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
153f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
154f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return lrot8(blob,len,c);
155f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
156f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
157f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
158f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void rrot ( void * blob, int len, int c )
159f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
160f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((len & 3) == 0)
161f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
162f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return rrot32(blob,len,c);
163f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
164f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
165f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
166f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return rrot8(blob,len,c);
167f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
168f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
169f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
170f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate < typename T >
171f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void lrot ( T & blob, int c )
172f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
173f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((sizeof(T) & 3) == 0)
174f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
175f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return lrot32(&blob,sizeof(T),c);
176f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
177f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
178f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
179f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return lrot8(&blob,sizeof(T),c);
180f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
181f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
182f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
183f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate < typename T >
184f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline void rrot ( T & blob, int c )
185f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
186f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((sizeof(T) & 3) == 0)
187f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
188f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return rrot32(&blob,sizeof(T),c);
189f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
190f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
191f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
192f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return rrot8(&blob,sizeof(T),c);
193f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
194f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
195f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
196f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void lrot ( uint32_t & blob, int c ) { blob = ROTL32(blob,c); }
197f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void lrot ( uint64_t & blob, int c ) { blob = ROTL64(blob,c); }
198f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void rrot ( uint32_t & blob, int c ) { blob = ROTR32(blob,c); }
199f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<> inline void rrot ( uint64_t & blob, int c ) { blob = ROTR64(blob,c); }
200f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
201f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//-----------------------------------------------------------------------------
202f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com// Bit-windowing functions - select some N-bit subset of the input blob
203f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
204f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t window1  ( void * blob, int len, int start, int count );
205f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t window8  ( void * blob, int len, int start, int count );
206f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comuint32_t window32 ( void * blob, int len, int start, int count );
207f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
208f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline uint32_t window ( void * blob, int len, int start, int count )
209f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
210f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if(len & 3)
211f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
212f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return window8(blob,len,start,count);
213f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
214f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
215f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
216f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return window32(blob,len,start,count);
217f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
218f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
219f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
220f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate < typename T >
221f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline uint32_t window ( T & blob, int start, int count )
222f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
223f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  if((sizeof(T) & 3) == 0)
224f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
225f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return window32(&blob,sizeof(T),start,count);
226f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
227f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  else
228f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  {
229f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com    return window8(&blob,sizeof(T),start,count);
230f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  }
231f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
232f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
233f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<>
234f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline uint32_t window ( uint32_t & blob, int start, int count )
235f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
236f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  return ROTR32(blob,start) & ((1<<count)-1);
237f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
238f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
239f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.comtemplate<>
240f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.cominline uint32_t window ( uint64_t & blob, int start, int count )
241f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com{
242f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com  return (uint32_t)ROTR64(blob,start) & ((1<<count)-1);
243f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com}
244f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com
245f3b789787b93945c974e2cc517b7dc352b28354etanjent@gmail.com//-----------------------------------------------------------------------------
246