comparison tango/tango/core/ByteSwap.d @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children
comparison
equal deleted inserted replaced
131:5825d48b27d1 132:1700239cab2e
1 /*******************************************************************************
2
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved
4
5 license: BSD style: $(LICENSE)
6
7 version: Initial release: October 2004
8
9 version: Feb 20th 2005 - Asm version removed by Aleksey Bobnev
10
11 author: Kris, Aleksey Bobnev
12
13 *******************************************************************************/
14
15 module tango.core.ByteSwap;
16
17 import tango.core.BitManip;
18
19 /*******************************************************************************
20
21 Reverse byte order for specific datum sizes. Note that the
22 byte-swap approach avoids alignment issues, so is probably
23 faster overall than a traditional 'shift' implementation.
24
25 *******************************************************************************/
26
27 struct ByteSwap
28 {
29 /***********************************************************************
30
31 ***********************************************************************/
32
33 final static void swap16 (void *dst, uint bytes)
34 {
35 ubyte* p = cast(ubyte*) dst;
36 while (bytes)
37 {
38 ubyte b = p[0];
39 p[0] = p[1];
40 p[1] = b;
41
42 p += short.sizeof;
43 bytes -= short.sizeof;
44 }
45 }
46
47 /***********************************************************************
48
49 ***********************************************************************/
50
51 final static void swap32 (void *dst, uint bytes)
52 {
53 uint* p = cast(uint*) dst;
54 while (bytes)
55 {
56 *p = bswap(*p);
57 p ++;
58 bytes -= int.sizeof;
59 }
60 }
61
62 /***********************************************************************
63
64 ***********************************************************************/
65
66 final static void swap64 (void *dst, uint bytes)
67 {
68 uint* p = cast(uint*) dst;
69 while (bytes)
70 {
71 uint i = p[0];
72 p[0] = bswap(p[1]);
73 p[1] = bswap(i);
74
75 p += (long.sizeof / int.sizeof);
76 bytes -= long.sizeof;
77 }
78 }
79
80 /***********************************************************************
81
82 ***********************************************************************/
83
84 final static void swap80 (void *dst, uint bytes)
85 {
86 ubyte* p = cast(ubyte*) dst;
87 while (bytes)
88 {
89 ubyte b = p[0];
90 p[0] = p[9];
91 p[9] = b;
92
93 b = p[1];
94 p[1] = p[8];
95 p[8] = b;
96
97 b = p[2];
98 p[2] = p[7];
99 p[7] = b;
100
101 b = p[3];
102 p[3] = p[6];
103 p[6] = b;
104
105 b = p[4];
106 p[4] = p[5];
107 p[5] = b;
108
109 p += real.sizeof;
110 bytes -= real.sizeof;
111 }
112 }
113 }
114
115
116
117