lz4hc.h revision d7298d2059a4f2da7aa19122d3af2aacb931972b
1a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet./*
2a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   LZ4 HC - High Compression Mode of LZ4
3a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   Header File
445a357fd1704e9c6d2d8037277bda62e8c86308eYann Collet   Copyright (C) 2011-2015, Yann Collet.
5a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
7a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   Redistribution and use in source and binary forms, with or without
8a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   modification, are permitted provided that the following conditions are
9a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   met:
10a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
11a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.       * Redistributions of source code must retain the above copyright
12a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   notice, this list of conditions and the following disclaimer.
13a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.       * Redistributions in binary form must reproduce the above
14a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   copyright notice, this list of conditions and the following disclaimer
15a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   in the documentation and/or other materials provided with the
16a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   distribution.
17a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
18a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
30a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.   You can contact the author at :
3145a357fd1704e9c6d2d8037277bda62e8c86308eYann Collet   - LZ4 source repository : https://github.com/Cyan4973/lz4
3245a357fd1704e9c6d2d8037277bda62e8c86308eYann Collet   - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
33a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.*/
34a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.#pragma once
35a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
36a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
37a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.#if defined (__cplusplus)
38a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.extern "C" {
39a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.#endif
40a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
41be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet/*****************************
42be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet*  Includes
43be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet*****************************/
44be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet#include <stddef.h>   /* size_t */
45be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet
46a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
47be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet/**************************************
48be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet*  Block Compression
49be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet**************************************/
50be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_safe (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
51a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet./*
52be9d248851ecd712a8911526b009c5d0c948ee21Yann ColletLZ4_compressHC_safe :
53a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.    return : the number of bytes in compressed buffer dest
54a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.             or 0 if compression fails.
55a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.    note : destination buffer must be already allocated.
56be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet        To guarantee compression completion, size it to handle worst cases situations (data not compressible)
57a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.        Worst case size evaluation is provided by function LZ4_compressBound() (see "lz4.h")
58be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet    inputSize  : Max supported value is LZ4_MAX_INPUT_SIZE (see "lz4.h")
59be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet    compressionLevel : Recommended values are between 4 and 9, although any value between 0 and 16 will work.
60be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet                       0 means use default 'compressionLevel' value.
61be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet                       Values >16 behave the same as 16.
62a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.*/
63a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
64a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
65a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet./* Note :
66d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet   Decompression functions are provided within LZ4 source code (see "lz4.h") (BSD license)
67a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.*/
68a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
69a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
70a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.int LZ4_sizeofStateHC(void);
71be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_safe_extStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
72a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
73a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet./*
74be9d248851ecd712a8911526b009c5d0c948ee21Yann ColletThis function is provided should you prefer to allocate memory for compression tables with your own allocation methods.
75a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.To know how much memory must be allocated for the compression tables, use :
76a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.int LZ4_sizeofStateHC();
77a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
78a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.Note that tables must be aligned for pointer (32 or 64 bits), otherwise compression will fail (return code 0).
79a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
80e2a985f52444ad2e1438d2a71575185f31a08540Yann ColletThe allocated memory can be provided to the compression functions using 'void* state' parameter.
81be9d248851ecd712a8911526b009c5d0c948ee21Yann ColletLZ4_compressHC_safe_extStateHC() is equivalent to previously described function.
82be9d248851ecd712a8911526b009c5d0c948ee21Yann ColletIt just uses externally allocated memory for stateHC instead of allocating their own (on stack, or on heap).
83a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.*/
84a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
85a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
86d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet/**************************************
87be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet*  Streaming Compression
88d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet**************************************/
89a357f434f06de70e5d670b8669becccb09f4c7a6Yann Collet#define LZ4_STREAMHCSIZE        262192
90a357f434f06de70e5d670b8669becccb09f4c7a6Yann Collet#define LZ4_STREAMHCSIZE_SIZET (LZ4_STREAMHCSIZE / sizeof(size_t))
91a357f434f06de70e5d670b8669becccb09f4c7a6Yann Collettypedef struct { size_t table[LZ4_STREAMHCSIZE_SIZET]; } LZ4_streamHC_t;
92d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet/*
93b827ecf72894156c1727482b145dc9e7a116dbc9Yann ColletLZ4_streamHC_t
94d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletThis structure allows static allocation of LZ4 HC streaming state.
95d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletState must then be initialized using LZ4_resetStreamHC() before first use.
96d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
97b827ecf72894156c1727482b145dc9e7a116dbc9Yann ColletStatic allocation should only be used with statically linked library.
98b827ecf72894156c1727482b145dc9e7a116dbc9Yann ColletIf you want to use LZ4 as a DLL, please use construction functions below, which are more future-proof.
99d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet*/
100d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
101b827ecf72894156c1727482b145dc9e7a116dbc9Yann Collet
102d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletLZ4_streamHC_t* LZ4_createStreamHC(void);
103d239a23337e5eba41f557b48eb26f0db81b28f26Yann Colletint             LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr);
104d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet/*
105d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletThese functions create and release memory for LZ4 HC streaming state.
106d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletNewly created states are already initialized.
107d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletExisting state space can be re-used anytime using LZ4_resetStreamHC().
108b827ecf72894156c1727482b145dc9e7a116dbc9Yann ColletIf you use LZ4 as a DLL, please use these functions instead of direct struct allocation,
109b827ecf72894156c1727482b145dc9e7a116dbc9Yann Colletto avoid size mismatch between different versions.
110d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet*/
111d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
112d239a23337e5eba41f557b48eb26f0db81b28f26Yann Colletvoid LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
113d239a23337e5eba41f557b48eb26f0db81b28f26Yann Colletint  LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, const char* dictionary, int dictSize);
114d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
115be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_safe_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
116d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
117d239a23337e5eba41f557b48eb26f0db81b28f26Yann Colletint LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int maxDictSize);
118d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
119d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet/*
120d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletThese functions compress data in successive blocks of any size, using previous blocks as dictionary.
1212b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann ColletOne key assumption is that each previous block will remain read-accessible while compressing next block.
122d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
123d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletBefore starting compression, state must be properly initialized, using LZ4_resetStreamHC().
124d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletA first "fictional block" can then be designated as initial dictionary, using LZ4_loadDictHC() (Optional).
125d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
126be9d248851ecd712a8911526b009c5d0c948ee21Yann ColletThen, use LZ4_compressHC_safe_continue() to compress each successive block.
127be9d248851ecd712a8911526b009c5d0c948ee21Yann ColletIt works like LZ4_compressHC_safe(), but use previous memory blocks to improve compression.
128d239a23337e5eba41f557b48eb26f0db81b28f26Yann ColletPrevious memory blocks (including initial dictionary when present) must remain accessible and unmodified during compression.
129d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
1302b421e97d4e7cfbefdc007bf30133b0de7e7e14eYann ColletIf, for any reason, previous data block can't be preserved in memory during next compression block,
13161289dea1d94510a4d6386bc44c08d3d15083123Yann Colletyou must save it to a safer memory space,
132d239a23337e5eba41f557b48eb26f0db81b28f26Yann Colletusing LZ4_saveDictHC().
133d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet*/
134d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
135d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
136d239a23337e5eba41f557b48eb26f0db81b28f26Yann Collet
137a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet./**************************************
138be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet * Deprecated Functions
139b827ecf72894156c1727482b145dc9e7a116dbc9Yann Collet * ************************************/
1409443f3d9244faedb08527bf684994a0495117833Yann Collet/* Deprecate Warnings */
1419443f3d9244faedb08527bf684994a0495117833Yann Collet/* Should these warnings messages be a problem,
1429443f3d9244faedb08527bf684994a0495117833Yann Collet   it is generally possible to disable them,
1439443f3d9244faedb08527bf684994a0495117833Yann Collet   with -Wno-deprecated-declarations for gcc
1449443f3d9244faedb08527bf684994a0495117833Yann Collet   or _CRT_SECURE_NO_WARNINGS in Visual for example.
145ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA   You can also define LZ4_DEPRECATE_WARNING_DEFBLOCK. */
146ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#ifndef LZ4_DEPRECATE_WARNING_DEFBLOCK
147ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#  define LZ4_DEPRECATE_WARNING_DEFBLOCK
148d7298d2059a4f2da7aa19122d3af2aacb931972bTakayuki MATSUOKA#  define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
149d7298d2059a4f2da7aa19122d3af2aacb931972bTakayuki MATSUOKA#  if (LZ4_GCC_VERSION >= 405) || defined(__clang__)
150ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#    define LZ4_DEPRECATED(message) __attribute__((deprecated(message)))
151d7298d2059a4f2da7aa19122d3af2aacb931972bTakayuki MATSUOKA#  elif (LZ4_GCC_VERSION >= 301)
152ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#    define LZ4_DEPRECATED(message) __attribute__((deprecated))
1539443f3d9244faedb08527bf684994a0495117833Yann Collet#  elif defined(_MSC_VER)
154ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#    define LZ4_DEPRECATED(message) __declspec(deprecated(message))
1559443f3d9244faedb08527bf684994a0495117833Yann Collet#  else
156ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#    pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler")
157ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#    define LZ4_DEPRECATED
1589443f3d9244faedb08527bf684994a0495117833Yann Collet#  endif
159ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKA#endif // LZ4_DEPRECATE_WARNING_DEFBLOCK
160be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet
161be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet/* compression functions */
1629443f3d9244faedb08527bf684994a0495117833Yann Collet/* these functions are planned to trigger warning messages by r131 approximately */
163be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC                (const char* source, char* dest, int inputSize);
164be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_limitedOutput  (const char* source, char* dest, int inputSize, int maxOutputSize);
165be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC2               (const char* source, char* dest, int inputSize, int compressionLevel);
166be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC2_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
167be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_withStateHC               (void* state, const char* source, char* dest, int inputSize);
168be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
169be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC2_withStateHC              (void* state, const char* source, char* dest, int inputSize, int compressionLevel);
170be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
171be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_continue               (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize);
172be9d248851ecd712a8911526b009c5d0c948ee21Yann Colletint LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
173be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet
174be9d248851ecd712a8911526b009c5d0c948ee21Yann Collet/* Streaming functions following the older model; should no longer be used */
175ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_createStreamHC() instead") void* LZ4_createHC (const char* inputBuffer);
176ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_saveDictHC() instead")     char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
177ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_freeStreamHC() instead")   int   LZ4_freeHC (void* LZ4HC_Data);
178ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_compressHC_safe_continue() instead") int   LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel);
179ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_compressHC_safe_continue() instead") int   LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
180ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_createStreamHC() instead") int   LZ4_sizeofStreamStateHC(void);
181ad86910b1b3633c2249a607bdbf2c138e8854f83Takayuki MATSUOKALZ4_DEPRECATED("use LZ4_resetStreamHC() instead")  int   LZ4_resetStreamStateHC(void* state, const char* inputBuffer);
182a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
183a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.
184a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.#if defined (__cplusplus)
185a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.}
186a9d8640c1f3898cd47eb1faf22db013e8b9911dbyann.collet.#endif
187