Deprecate crc32 and move it into std.hash.crc32.

This commit is contained in:
alexrp 2012-05-15 03:49:24 +02:00 committed by alexrp
parent 1480c79aed
commit d6c2ef0fb6
6 changed files with 152 additions and 9 deletions

View file

@ -14,6 +14,8 @@
// CRC-32 calculation // CRC-32 calculation
module crc32; module crc32;
pragma(msg, "The 'crc32' module has been scheduled for deprecation. Please use 'std.hash.crc32' instead.");
private immutable uint[256] crc32_table = private immutable uint[256] crc32_table =
[ [
0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535, 0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,

View file

@ -54,7 +54,7 @@ DOCSRC = ../d-programming-language.org
WEBSITE_DIR = ../web WEBSITE_DIR = ../web
DOC_OUTPUT_DIR = $(WEBSITE_DIR)/phobos-prerelease DOC_OUTPUT_DIR = $(WEBSITE_DIR)/phobos-prerelease
BIGDOC_OUTPUT_DIR = /tmp BIGDOC_OUTPUT_DIR = /tmp
SRC_DOCUMENTABLES = index.d $(addsuffix .d,$(STD_MODULES) $(STD_NET_MODULES) $(EXTRA_DOCUMENTABLES)) SRC_DOCUMENTABLES = index.d $(addsuffix .d,$(STD_MODULES) $(STD_NET_MODULES) $(STD_HASH_MODULES) $(EXTRA_DOCUMENTABLES))
STDDOC = $(DOCSRC)/std.ddoc STDDOC = $(DOCSRC)/std.ddoc
BIGSTDDOC = $(DOCSRC)/std_consolidated.ddoc BIGSTDDOC = $(DOCSRC)/std_consolidated.ddoc
DDOCFLAGS=-m$(MODEL) -d -c -o- -version=StdDdoc -I$(DRUNTIME_PATH)/import $(DMDEXTRAFLAGS) DDOCFLAGS=-m$(MODEL) -d -c -o- -version=StdDdoc -I$(DRUNTIME_PATH)/import $(DMDEXTRAFLAGS)
@ -162,6 +162,8 @@ STD_MODULES = $(addprefix std/, algorithm array ascii base64 bigint \
STD_NET_MODULES = $(addprefix std/net/, isemail curl) STD_NET_MODULES = $(addprefix std/net/, isemail curl)
STD_HASH_MODULES = $(addprefix std/hash/, crc32)
# OS-specific D modules # OS-specific D modules
EXTRA_MODULES_LINUX := $(addprefix std/c/linux/, linux socket) EXTRA_MODULES_LINUX := $(addprefix std/c/linux/, linux socket)
EXTRA_MODULES_OSX := $(addprefix std/c/osx/, socket) EXTRA_MODULES_OSX := $(addprefix std/c/osx/, socket)
@ -184,7 +186,7 @@ EXTRA_MODULES += $(EXTRA_DOCUMENTABLES) $(addprefix \
processinit uni uni_tab) processinit uni uni_tab)
# Aggregate all D modules relevant to this build # Aggregate all D modules relevant to this build
D_MODULES = crc32 $(STD_MODULES) $(EXTRA_MODULES) $(STD_NET_MODULES) D_MODULES = $(STD_MODULES) $(EXTRA_MODULES) $(STD_NET_MODULES) $(STD_HASH_MODULES)
# Add the .d suffix to the module names # Add the .d suffix to the module names
D_FILES = $(addsuffix .d,$(D_MODULES)) D_FILES = $(addsuffix .d,$(D_MODULES))
# Aggregate all D modules over all OSs (this is for the zip file) # Aggregate all D modules over all OSs (this is for the zip file)

128
std/hash/crc32.d Normal file
View file

@ -0,0 +1,128 @@
/*
* Copyright (c) 2001, 2002
* Pavel "EvilOne" Minayev
* Copyright (c) 2012
* Alex Rønne Petersen
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Author makes no representations about
* the suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*/
/**
Cyclic Redundancy Check (32-bit) implementation.
Macros:
WIKI = StdHashCRC32
Copyright: Copyright Pavel "EvilOne" Minayev 2001, 2002. Copyright Alex Rønne Petersen 2012.
License:
Permission to use, copy, modify, distribute and sell this software
and its documentation for any purpose is hereby granted without fee,
provided that the above copyright notice appear in all copies and
that both that copyright notice and this permission notice appear
in supporting documentation. Author makes no representations about
the suitability of this software for any purpose. It is provided
"as is" without express or implied warranty.
Authors: Pavel "EvilOne" Minayev, Alex Rønne Petersen
Source: $(PHOBOSSRC std/hash/_crc32.d)
*/
// CRC-32 calculation
module std.hash.crc32;
import std.range;
@safe:
private immutable uint[256] crc32_table =
[
0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,
0x9e6495a3,0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,
0xe7b82d07,0x90bf1d91,0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de,0x1adad47d,
0x6ddde4eb,0xf4d4b551,0x83d385c7,0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec,
0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,0x3b6e20c8,0x4c69105e,0xd56041e4,
0xa2677172,0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,0x35b5a8fa,0x42b2986c,
0xdbbbc9d6,0xacbcf940,0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59,0x26d930ac,
0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f,
0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,
0xb6662d3d,0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,
0x9fbfe4a5,0xe8b8d433,0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,
0x086d3d2d,0x91646c97,0xe6635c01,0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e,
0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,0x65b0d9c6,0x12b7e950,0x8bbeb8ea,
0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,0x4db26158,0x3ab551ce,
0xa3bc0074,0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,0x4369e96a,
0x346ed9fc,0xad678846,0xda60b8d0,0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9,
0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,0x206f85b3,0xb966d409,
0xce61e49f,0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,
0xb7bd5c3b,0xc0ba6cad,0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,
0x9dd277af,0x04db2615,0x73dc1683,0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,
0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,0xf00f9344,0x8708a3d2,0x1e01f268,
0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,0xfed41b76,0x89d32be0,
0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,0xd6d6a3e8,
0xa1d1937e,0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b,
0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,
0x4669be79,0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,0xcc0c7795,0xbb0b4703,
0x220216b9,0x5505262f,0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,
0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,
0x9c0906a9,0xeb0e363f,0x72076785,0x05005713,0x95bf4a82,0xe2b87a14,0x7bb12bae,
0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21,0x86d3d2d4,0xf1d4e242,
0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,0x88085ae6,
0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45,
0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,
0x3e6e77db,0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,
0x47b2cf7f,0x30b5ffe9,0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6,0xbad03605,
0xcdd70693,0x54de5729,0x23d967bf,0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,
0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d
];
/**
* The initial value of a CRC32 computation.
*/
enum uint crc32Init = uint.max;
/**
* Updates a given CRC32 value with the given byte value.
*
* Params:
* crc = The current CRC32 value.
* val = The value to add to the CRC32 computation.
*/
uint updateCRC32(T)(uint crc, T val) pure nothrow
if (is(T == ubyte) || is(T == byte))
{
return crc32_table[cast(ubyte)crc ^ cast(ubyte)val] ^ (crc >> 8);
}
/**
* Computes the CRC32 value of a given range of bytes.
*
* Params:
* range = The range to compute a CRC32 value for.
*/
uint rangeToCRC32(R)(in R range) pure nothrow
if (isInputRange!R && (is(ElementType!R == byte) || is(ElementType!R == ubyte)))
{
uint crc = crc32Init;
foreach (val; range)
crc = updateCRC32!(ElementType!R)(crc, val);
return crc;
}
unittest
{
ubyte[] bytes1 = [1, 2, 3];
byte[] bytes2 = [1, 2, 3];
rangeToCRC32(bytes1); // ensure that we can call with ubyte[]
rangeToCRC32(bytes2); // ensure that we can call with byte[]
}

View file

@ -385,7 +385,7 @@ interface OutputStream {
// not really abstract, but its instances will do nothing useful // not really abstract, but its instances will do nothing useful
class Stream : InputStream, OutputStream { class Stream : InputStream, OutputStream {
private import std.string, crc32, std.c.stdlib, std.c.stdio; private import std.string, std.hash.crc32, std.c.stdlib, std.c.stdio;
// stream abilities // stream abilities
bool readable = false; /// Indicates whether this stream can be read from. bool readable = false; /// Indicates whether this stream can be read from.
@ -1344,14 +1344,14 @@ class Stream : InputStream, OutputStream {
{ {
ulong pos = position; ulong pos = position;
scope(exit) position(pos); scope(exit) position(pos);
uint crc = init_crc32(); uint crc = crc32Init;
position(0); position(0);
ulong len = size; ulong len = size;
for (ulong i = 0; i < len; i++) for (ulong i = 0; i < len; i++)
{ {
ubyte c; ubyte c;
read(c); read(c);
crc = update_crc32(c, crc); crc = updateCRC32(crc, c);
} }
return crc; return crc;
} }

View file

@ -18,6 +18,7 @@ public import std.compiler;
public import std.concurrency; public import std.concurrency;
public import std.conv; public import std.conv;
public import std.cpuid; public import std.cpuid;
public import std.hash.crc32;
public import std.cstream; public import std.cstream;
public import std.ctype; public import std.ctype;
public import std.datetime; public import std.datetime;

View file

@ -132,7 +132,7 @@ SRC_STD_REST= std\variant.d \
SRC_STD_ALL= $(SRC_STD_1_HEAVY) $(SRC_STD_2_HEAVY) $(SRC_STD_3) $(SRC_STD_REST) SRC_STD_ALL= $(SRC_STD_1_HEAVY) $(SRC_STD_2_HEAVY) $(SRC_STD_3) $(SRC_STD_REST)
SRC= unittest.d crc32.d index.d SRC= unittest.d index.d
SRC_STD= std\zlib.d std\zip.d std\stdint.d std\container.d std\conv.d std\utf.d std\uri.d \ SRC_STD= std\zlib.d std\zip.d std\stdint.d std\container.d std\conv.d std\utf.d std\uri.d \
std\math.d std\string.d std\path.d std\datetime.d \ std\math.d std\string.d std\path.d std\datetime.d \
@ -177,15 +177,17 @@ SRC_STD_INTERNAL= std\internal\processinit.d std\internal\uni.d std\internal\uni
SRC_STD_INTERNAL_MATH= std\internal\math\biguintcore.d \ SRC_STD_INTERNAL_MATH= std\internal\math\biguintcore.d \
std\internal\math\biguintnoasm.d std\internal\math\biguintx86.d \ std\internal\math\biguintnoasm.d std\internal\math\biguintx86.d \
std\internal\math\gammafunction.d std\internal\math\errorfunction.d std\internal\math\gammafunction.d std\internal\math\errorfunction.d
SRC_STD_INTERNAL_WINDOWS= std\internal\windows\advapi32.d SRC_STD_INTERNAL_WINDOWS= std\internal\windows\advapi32.d
SRC_STD_HASH= std\hash\crc32.d
SRC_ETC= SRC_ETC=
SRC_ETC_C= etc\c\zlib.d etc\c\curl.d etc\c\sqlite3.d SRC_ETC_C= etc\c\zlib.d etc\c\curl.d etc\c\sqlite3.d
SRC_TO_COMPILE_NOT_STD= crc32.d \ SRC_TO_COMPILE_NOT_STD= \
$(SRC_STD_NET) \ $(SRC_STD_NET) \
$(SRC_STD_C) \ $(SRC_STD_C) \
$(SRC_STD_WIN) \ $(SRC_STD_WIN) \
@ -193,6 +195,7 @@ SRC_TO_COMPILE_NOT_STD= crc32.d \
$(SRC_STD_INTERNAL) \ $(SRC_STD_INTERNAL) \
$(SRC_STD_INTERNAL_MATH) \ $(SRC_STD_INTERNAL_MATH) \
$(SRC_STD_INTERNAL_WINDOWS) \ $(SRC_STD_INTERNAL_WINDOWS) \
$(SRC_STD_HASH) \
$(SRC_ETC) \ $(SRC_ETC) \
$(SRC_ETC_C) $(SRC_ETC_C)
@ -267,6 +270,7 @@ DOCS= $(DOC)\object.html \
$(DOC)\std_container.html \ $(DOC)\std_container.html \
$(DOC)\std_conv.html \ $(DOC)\std_conv.html \
$(DOC)\std_cpuid.html \ $(DOC)\std_cpuid.html \
$(DOC)\std_hash_crc32.html \
$(DOC)\std_cstream.html \ $(DOC)\std_cstream.html \
$(DOC)\std_ctype.html \ $(DOC)\std_ctype.html \
$(DOC)\std_csv.html \ $(DOC)\std_csv.html \
@ -610,6 +614,9 @@ $(DOC)\std_zlib.html : $(STDDOC) std\zlib.d
$(DOC)\std_net_isemail.html : $(STDDOC) std\net\isemail.d $(DOC)\std_net_isemail.html : $(STDDOC) std\net\isemail.d
$(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_net_isemail.html $(STDDOC) std\net\isemail.d $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_net_isemail.html $(STDDOC) std\net\isemail.d
$(DOC)\std_hash_crc32.html : $(STDDOC) std\hash\crc32.d
$(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_hash_crc32.html $(STDDOC) std\hash\crc32.d
$(DOC)\std_net_curl.html : $(STDDOC) std\net\curl.d $(DOC)\std_net_curl.html : $(STDDOC) std\net\curl.d
$(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_net_curl.html $(STDDOC) std\net\curl.d $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_net_curl.html $(STDDOC) std\net\curl.d
@ -667,7 +674,7 @@ $(DOC)\etc_c_zlib.html : $(STDDOC) etc\c\zlib.d
zip : win32.mak posix.mak $(STDDOC) $(SRC) \ zip : win32.mak posix.mak $(STDDOC) $(SRC) \
$(SRC_STD) $(SRC_STD_C) $(SRC_STD_WIN) \ $(SRC_STD) $(SRC_STD_C) $(SRC_STD_WIN) \
$(SRC_STD_C_WIN) $(SRC_STD_C_LINUX) $(SRC_STD_C_OSX) $(SRC_STD_C_FREEBSD) \ $(SRC_STD_C_WIN) $(SRC_STD_C_LINUX) $(SRC_STD_C_OSX) $(SRC_STD_C_FREEBSD) \
$(SRC_ETC) $(SRC_ETC_C) $(SRC_ZLIB) $(SRC_STD_NET) \ $(SRC_ETC) $(SRC_ETC_C) $(SRC_ZLIB) $(SRC_STD_NET) $(SRC_STD_HASH) \
$(SRC_STD_INTERNAL) $(SRC_STD_INTERNAL_MATH) $(SRC_STD_INTERNAL_WINDOWS) $(SRC_STD_INTERNAL) $(SRC_STD_INTERNAL_MATH) $(SRC_STD_INTERNAL_WINDOWS)
del phobos.zip del phobos.zip
zip32 -u phobos win32.mak posix.mak $(STDDOC) zip32 -u phobos win32.mak posix.mak $(STDDOC)
@ -682,6 +689,7 @@ zip : win32.mak posix.mak $(STDDOC) $(SRC) \
zip32 -u phobos $(SRC_STD_INTERNAL) zip32 -u phobos $(SRC_STD_INTERNAL)
zip32 -u phobos $(SRC_STD_INTERNAL_MATH) zip32 -u phobos $(SRC_STD_INTERNAL_MATH)
zip32 -u phobos $(SRC_STD_INTERNAL_WINDOWS) zip32 -u phobos $(SRC_STD_INTERNAL_WINDOWS)
zip32 -u phobos $(SRC_STD_HASH)
zip32 -u phobos $(SRC_ETC) $(SRC_ETC_C) zip32 -u phobos $(SRC_ETC) $(SRC_ETC_C)
zip32 -u phobos $(SRC_ZLIB) zip32 -u phobos $(SRC_ZLIB)
zip32 -u phobos $(SRC_STD_NET) zip32 -u phobos $(SRC_STD_NET)
@ -714,6 +722,7 @@ install:
$(CP) $(SRC_STD_INTERNAL) $(DIR)\src\phobos\std\internal\ $(CP) $(SRC_STD_INTERNAL) $(DIR)\src\phobos\std\internal\
$(CP) $(SRC_STD_INTERNAL_MATH) $(DIR)\src\phobos\std\internal\math\ $(CP) $(SRC_STD_INTERNAL_MATH) $(DIR)\src\phobos\std\internal\math\
$(CP) $(SRC_STD_INTERNAL_WINDOWS) $(DIR)\src\phobos\std\internal\windows\ $(CP) $(SRC_STD_INTERNAL_WINDOWS) $(DIR)\src\phobos\std\internal\windows\
$(CP) $(SRC_STD_HASH) $(DIR)\src\phobos\std\hash\
#$(CP) $(SRC_ETC) $(DIR)\src\phobos\etc\ #$(CP) $(SRC_ETC) $(DIR)\src\phobos\etc\
$(CP) $(SRC_ETC_C) $(DIR)\src\phobos\etc\c\ $(CP) $(SRC_ETC_C) $(DIR)\src\phobos\etc\c\
$(CP) $(SRC_ZLIB) $(DIR)\src\phobos\etc\c\zlib\ $(CP) $(SRC_ZLIB) $(DIR)\src\phobos\etc\c\zlib\
@ -733,6 +742,7 @@ svn:
$(CP) $(SRC_STD_INTERNAL) $(SVN)\std\internal\ $(CP) $(SRC_STD_INTERNAL) $(SVN)\std\internal\
$(CP) $(SRC_STD_INTERNAL_MATH) $(SVN)\std\internal\math\ $(CP) $(SRC_STD_INTERNAL_MATH) $(SVN)\std\internal\math\
$(CP) $(SRC_STD_INTERNAL_WINDOWS) $(SVN)\std\internal\windows\ $(CP) $(SRC_STD_INTERNAL_WINDOWS) $(SVN)\std\internal\windows\
$(CP) $(STC_STD_HASH) $(SVN)\std\hash\
#$(CP) $(SRC_ETC) $(SVN)\etc\ #$(CP) $(SRC_ETC) $(SVN)\etc\
$(CP) $(SRC_ETC_C) $(SVN)\etc\c\ $(CP) $(SRC_ETC_C) $(SVN)\etc\c\
$(CP) $(SRC_ZLIB) $(SVN)\etc\c\zlib\ $(CP) $(SRC_ZLIB) $(SVN)\etc\c\zlib\