private static string SelectCodec( string codec, string architecture, out TimedMethod compressor, out TimedMethod decompressor) { string codecCode; switch (codec.ToLower()) { // compare implementation for LZ4 only case "mixedmode32": codecCode = string.Format("MixedMode32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "mixedmode64": codecCode = string.Format("MixedMode64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "cppcli32": codecCode = string.Format("C++/CLI32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "cppcli64": codecCode = string.Format("C++/CLI64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "unsafe64": codecCode = string.Format("Unsafe64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "unsafe32": codecCode = string.Format("Unsafe32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "safe64": codecCode = string.Format("Safe64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "safe32": codecCode = string.Format("Safe32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode32(b, 0, b.Length, l)); break; // compare implementation for LZ4HC only case "mixedmode32hc": codecCode = string.Format("MixedMode32HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "mixedmode64hc": codecCode = string.Format("MixedMode64HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "cppcli32hc": codecCode = string.Format("C++/CLI32HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode32HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "cppcli64hc": codecCode = string.Format("C++/CLI64HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode64HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "unsafe64hc": codecCode = string.Format("Unsafe64HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode64HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "unsafe32hc": codecCode = string.Format("Unsafe32HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode32HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "safe64hc": codecCode = string.Format("Safe64HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode64HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "safe32hc": codecCode = string.Format("Safe32HC@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32HC(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode32(b, 0, b.Length, l)); break; // compare different algorithms (LZ4, LZO, Snappy, QuickLZ) case "lz4.native": codecCode = string.Format("LZ4.native@{0}", architecture); if (IntPtr.Size == 4) { compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l)); } else { compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l)); } break; case "lz4.unsafe": codecCode = string.Format("LZ4.unsafe@{0}", architecture); if (IntPtr.Size == 4) { compressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode64(b, 0, b.Length, l)); } else { compressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4pn.LZ4Codec.Decode32(b, 0, b.Length, l)); } break; #if !X64 // LZO is available only in 32-bit mode case "lzo1x.native": codecCode = string.Format("LZO1X.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1XCompressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x11.native": codecCode = string.Format("LZO1X11.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X11Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x12.native": codecCode = string.Format("LZO1X12.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X12Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x15.native": codecCode = string.Format("LZO1X15.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X15Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x999.native": codecCode = string.Format("LZO1X999.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X999Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; #endif case "lz4sharp.unsafe": codecCode = string.Format("LZ4Sharp.unsafe@{0}", architecture); if (IntPtr.Size == 4) { var lz4sharp_compressor32 = new LZ4Sharp.LZ4Compressor32(); var lz4sharp_decompressor32 = new LZ4Sharp.LZ4Decompressor32(); compressor = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor32.Compress(b)); decompressor = new TimedMethod(codecCode, (b, l) => { var output = new byte[l]; lz4sharp_decompressor32.DecompressKnownSize(b, output); return(output); }); } else { var lz4sharp_compressor64 = new LZ4Sharp.LZ4Compressor64(); var lz4sharp_decompressor64 = new LZ4Sharp.LZ4Decompressor64(); compressor = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor64.Compress(b)); decompressor = new TimedMethod(codecCode, (b, l) => { var output = new byte[l]; lz4sharp_decompressor64.DecompressKnownSize(b, output); return(output); }); } break; case "quicklz.native": codecCode = string.Format("QuickLZ.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeQuickLZCompressor); decompressor = new TimedMethod(codecCode, NativeQuickLZDecompressor); break; case "snappy.native": codecCode = string.Format("Snappy.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeSnappyCompressor); decompressor = new TimedMethod(codecCode, NativeSnappyDecompressor); break; // safe compressors case "lz4.safe": codecCode = string.Format("LZ4.safe@{0}", architecture); if (IntPtr.Size == 4) { compressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l)); } else { compressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4ps.LZ4Codec.Decode64(b, 0, b.Length, l)); } break; case "lzf.safe": codecCode = string.Format("LZF.safe@{0}", architecture); compressor = new TimedMethod(codecCode, SafeLZFCompressor); decompressor = new TimedMethod(codecCode, SafeLZFDecompressor); break; case "quicklz1.safe": codecCode = string.Format("QuickLZ1.safe@{0}", architecture); compressor = new TimedMethod(codecCode, SafeQuickLZ1Compressor); decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor); break; case "quicklz3.safe": codecCode = string.Format("QuickLZ3.safe@{0}", architecture); compressor = new TimedMethod(codecCode, SafeQuickLZ3Compressor); decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor); break; case "deflate.safe": codecCode = string.Format("Deflate.safe@{0}", architecture); compressor = new TimedMethod(codecCode, DeflateCompressor); decompressor = new TimedMethod(codecCode, DeflateDecompressor); break; default: throw new ArgumentException(string.Format("Unknown codec: {0}", codec)); } return(codecCode); }
private static string SelectCodec( string codec, string architecture, out TimedMethod compressor, out TimedMethod decompressor) { string codecCode; switch (codec.ToLower()) { // compare implementation for LZ4 only case "mixedmode32": codecCode = string.Format("MixedMode32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "mixedmode64": codecCode = string.Format("MixedMode64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "cppcli32": codecCode = string.Format("C++/CLI32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "cppcli64": codecCode = string.Format("C++/CLI64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4cc.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "unsafe64": codecCode = string.Format("Unsafe64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "unsafe32": codecCode = string.Format("Unsafe32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode32(b, 0, b.Length, l)); break; case "safe64": codecCode = string.Format("Safe64@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode64(b, 0, b.Length, l)); break; case "safe32": codecCode = string.Format("Safe32@{0}", architecture); compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode32(b, 0, b.Length, l)); break; // compare different algorithms (LZ4, LZO, Snappy, QuickLZ) case "lz4.native": codecCode = string.Format("LZ4.native@{0}", architecture); if (IntPtr.Size == 4) { compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode32(b, 0, b.Length, l)); } else { compressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4mm.LZ4Codec.Decode64(b, 0, b.Length, l)); } break; case "lz4.unsafe": codecCode = string.Format("LZ4.unsafe@{0}", architecture); if (IntPtr.Size == 4) { compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode64(b, 0, b.Length, l)); } else { compressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Encode64(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4n.LZ4Codec.Decode32(b, 0, b.Length, l)); } break; #if !X64 // LZO is available only in 32-bit mode case "lzo1x.native": codecCode = string.Format("LZO1X.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1XCompressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x11.native": codecCode = string.Format("LZO1X11.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X11Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x12.native": codecCode = string.Format("LZO1X12.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X12Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x15.native": codecCode = string.Format("LZO1X15.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X15Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; case "lzo1x999.native": codecCode = string.Format("LZO1X999.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeLZO1X999Compressor); decompressor = new TimedMethod(codecCode, NativeLZODecompressor); break; #endif case "lz4sharp.unsafe": codecCode = string.Format("LZ4Sharp.unsafe@{0}", architecture); if (IntPtr.Size == 4) { var lz4sharp_compressor32 = new LZ4Sharp.LZ4Compressor32(); var lz4sharp_decompressor32 = new LZ4Sharp.LZ4Decompressor32(); compressor = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor32.Compress(b)); decompressor = new TimedMethod(codecCode, (b, l) => { var output = new byte[l]; lz4sharp_decompressor32.DecompressKnownSize(b, output); return output; }); } else { var lz4sharp_compressor64 = new LZ4Sharp.LZ4Compressor64(); var lz4sharp_decompressor64 = new LZ4Sharp.LZ4Decompressor64(); compressor = new TimedMethod(codecCode, (b, l) => lz4sharp_compressor64.Compress(b)); decompressor = new TimedMethod(codecCode, (b, l) => { var output = new byte[l]; lz4sharp_decompressor64.DecompressKnownSize(b, output); return output; }); } break; case "quicklz.native": codecCode = string.Format("QuickLZ.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeQuickLZCompressor); decompressor = new TimedMethod(codecCode, NativeQuickLZDecompressor); break; case "snappy.native": codecCode = string.Format("Snappy.native@{0}", architecture); compressor = new TimedMethod(codecCode, NativeSnappyCompressor); decompressor = new TimedMethod(codecCode, NativeSnappyDecompressor); break; // safe compressors case "lz4.safe": codecCode = string.Format("LZ4.safe@{0}", architecture); if (IntPtr.Size == 4) { compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode64(b, 0, b.Length, l)); } else { compressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Encode32(b, 0, l)); decompressor = new TimedMethod(codecCode, (b, l) => LZ4s.LZ4Codec.Decode64(b, 0, b.Length, l)); } break; case "lzf.safe": codecCode = string.Format("LZF.safe@{0}", architecture); compressor = new TimedMethod(codecCode, SafeLZFCompressor); decompressor = new TimedMethod(codecCode, SafeLZFDecompressor); break; case "quicklz1.safe": codecCode = string.Format("QuickLZ1.safe@{0}", architecture); compressor = new TimedMethod(codecCode, SafeQuickLZ1Compressor); decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor); break; case "quicklz3.safe": codecCode = string.Format("QuickLZ3.safe@{0}", architecture); compressor = new TimedMethod(codecCode, SafeQuickLZ3Compressor); decompressor = new TimedMethod(codecCode, SafeQuickLZDecompressor); break; case "deflate.safe": codecCode = string.Format("Deflate.safe@{0}", architecture); compressor = new TimedMethod(codecCode, DeflateCompressor); decompressor = new TimedMethod(codecCode, DeflateDecompressor); break; default: throw new ArgumentException(string.Format("Unknown codec: {0}", codec)); } return codecCode; }