Index: source/ariba/utility/serialization/DataUtilities.hpp
===================================================================
--- source/ariba/utility/serialization/DataUtilities.hpp	(revision 4619)
+++ source/ariba/utility/serialization/DataUtilities.hpp	(revision 4622)
@@ -71,4 +71,14 @@
 #include <string>
 
+template<typename X> finline
+static X shr( const X& value, unsigned int bits ) {
+	return (sizeof(X)*8 == bits) ? 0 : (value >> bits);
+}
+
+template<typename X> finline
+static X shl( const X& value, unsigned int bits ) {
+	return (sizeof(X)*8 == bits) ? 0 : (value << bits);
+}
+
 /**
  * TODO: Doc
@@ -77,5 +87,5 @@
 static X bitblk(size_t index, size_t length, bool value, if_uint(X)) {
 	if (index == 0 && length >= sizeof(X) * 8) return value ? ~0 : 0;
-	X x = ((((X) 1) << length) - 1) << index;
+	X x = shl(( shl( ((X) 1), length) - 1), index);
 	return value ? x : ~x;
 }
@@ -107,5 +117,5 @@
 	if (srcInvert) srcIdx = sizeof(X) * 8 - srcIdx - len;
 	if (dstInvert) dstIdx = sizeof(Y) * 8 - dstIdx - len;
-	Y value = ((Y) (src >> srcIdx)) << dstIdx;
+	Y value = ((Y)shr(src, srcIdx)) << dstIdx;
 	Y mask = bitblk<Y, 0> (dstIdx, len);
 	return (dst & mask) | (value & ~mask);
@@ -136,5 +146,5 @@
 	// check if first word only is affected
 	if ((dwp + len) <= w) {
-		X fw = (src[0] << swp) | (src[1] >> iswp);
+		X fw = shl(src[0],swp) | shr(src[1],iswp);
 		*dst = bitcpy(fw, 0, *dst, dwp, len, true, true);
 		return;
@@ -143,6 +153,6 @@
 	// set first word
 	if (idwp != 0) {
-		X fw = (src[0] << swp) | (src[1] >> iswp);
-		*dst = (*dst & ~(((X) 1 << idwp) - 1)) | (fw >> dwp);
+		X fw = shl(src[0],swp) | shr(src[1],iswp);
+		*dst = (*dst & ~(((X) 1 << idwp) - 1)) | shr(fw,dwp);
 
 		// recalculate indexes & lengths
@@ -169,5 +179,5 @@
 		a = src[0], b = src[1];
 		while (len >= w) {
-			*dst = (a << swp) | (b >> iswp);
+			*dst = shl(a,swp) | shr(b,iswp);
 			dst++;
 			src++;
@@ -179,7 +189,9 @@
 
 	// set last word
-	X lw = (a << swp) | (b >> iswp), lm = (((X) 1 << (w - len)) - 1);
+	X lw = shl(a,swp) | shr(b,iswp), lm = (shl((X) 1,(w - len)) - 1);
 	*dst = (*dst & lm) | (lw & ~lm);
 }
+
+
 
 /**
@@ -205,5 +217,5 @@
 		src++;
 		while (len >= w) {
-			X x = (a << swp) | (b >> iswp);
+			X x = shl(a,swp) | shr(b,iswp);
 			value <<= w;
 			value |= x;
@@ -216,5 +228,5 @@
 		if ( len> 0 ) {
 			value <<= len;
-			value |= (((a << swp) | (b >> iswp)) >> (w - len)) & ((1 << len)-1);
+			value |= ((shl(a,swp) | shr(b,iswp)) >> (w - len)) & (shl(1,len)-1);
 		}
 
@@ -254,8 +266,8 @@
 		size_t idwp = w - dwp;
 		src >>= srcIdx;
-		X mask1 = ~((1 << idwp) - 1);
-		dst[0] = (dst[0] & mask1) | ((src >> (len - idwp)) & ~mask1);
-		X mask2 = (1 << (w - len + idwp)) - 1;
-		dst[1] = (dst[1] & mask2) | ((src << (w - len + idwp)) & ~mask2);
+		X mask1 = ~(shl(1,idwp) - 1);
+		dst[0] = (dst[0] & mask1) | (shr(src,(len - idwp)) & ~mask1);
+		X mask2 = shl(1,(w - len + idwp)) - 1;
+		dst[1] = (dst[1] & mask2) | (shl(src, (w - len + idwp)) & ~mask2);
 	}
 }
@@ -277,9 +289,9 @@
 		// check inversion
 		if (srcInvert) srcIdx = sizeof(Y) * 8 - srcIdx - len;
-		src >>= srcIdx;
+		src = shr(src, srcIdx);
 
 		const size_t dw = sizeof(X)*8;
 		while (len >= dw) {
-			X word = (X)(src >> (len-dw));
+			X word = (X)shr(src,(len-dw));
 			bitcpy(word,0,dst,dstIdx,dw);
 			dstIdx += dw;
