Cortex  10.0.0-a4
MurmurHash.h
1 //
3 // Copyright (c) 2011-2013, Image Engine Design Inc. All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //
12 // * Redistributions in binary form must reproduce the above copyright
13 // notice, this list of conditions and the following disclaimer in the
14 // documentation and/or other materials provided with the distribution.
15 //
16 // * Neither the name of Image Engine Design nor the names of any
17 // other contributors to this software may be used to endorse or
18 // promote products derived from this software without specific prior
19 // written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
34 
35 #ifndef IECORE_MURMURHASH_H
36 #define IECORE_MURMURHASH_H
37 
38 #include <stdint.h>
39 #include <iostream>
40 
41 #include "tbb/concurrent_hash_map.h"
42 
43 #include "OpenEXR/ImathMatrix.h"
44 #include "OpenEXR/ImathBox.h"
45 #include "OpenEXR/ImathVec.h"
46 #include "OpenEXR/ImathColor.h"
47 #include "OpenEXR/ImathQuat.h"
48 
49 #include "IECore/Export.h"
50 #include "IECore/InternedString.h"
51 
52 namespace IECore
53 {
54 
64 class IECORE_API MurmurHash
65 {
66 
67  public :
68 
69  MurmurHash();
70  MurmurHash( const MurmurHash &other );
71 
72  inline MurmurHash &append( char data );
73  inline MurmurHash &append( unsigned char data );
74  inline MurmurHash &append( short data );
75  inline MurmurHash &append( unsigned short data );
76  inline MurmurHash &append( int data );
77  inline MurmurHash &append( unsigned int data );
78  inline MurmurHash &append( int64_t data );
79  inline MurmurHash &append( uint64_t data );
80  inline MurmurHash &append( half data );
81  inline MurmurHash &append( float data );
82  inline MurmurHash &append( double data );
83  inline MurmurHash &append( const char *data );
84  inline MurmurHash &append( const std::string &data );
85  inline MurmurHash &append( const InternedString &data );
86  inline MurmurHash &append( const Imath::V2i &data );
87  inline MurmurHash &append( const Imath::V2f &data );
88  inline MurmurHash &append( const Imath::V2d &data );
89  inline MurmurHash &append( const Imath::V3i &data );
90  inline MurmurHash &append( const Imath::V3f &data );
91  inline MurmurHash &append( const Imath::V3d &data );
92  inline MurmurHash &append( const Imath::Color3f &data );
93  inline MurmurHash &append( const Imath::Color3<double> &data );
94  inline MurmurHash &append( const Imath::Color4f &data );
95  inline MurmurHash &append( const Imath::Color4<double> &data );
96  inline MurmurHash &append( const Imath::M33f &data );
97  inline MurmurHash &append( const Imath::M33d &data );
98  inline MurmurHash &append( const Imath::M44f &data );
99  inline MurmurHash &append( const Imath::M44d &data );
100  inline MurmurHash &append( const Imath::Box2i &data );
101  inline MurmurHash &append( const Imath::Box2f &data );
102  inline MurmurHash &append( const Imath::Box2d &data );
103  inline MurmurHash &append( const Imath::Box3i &data );
104  inline MurmurHash &append( const Imath::Box3f &data );
105  inline MurmurHash &append( const Imath::Box3d &data );
106  inline MurmurHash &append( const Imath::Quatf &data );
107  inline MurmurHash &append( const Imath::Quatd &data );
108  inline MurmurHash &append( const MurmurHash &data );
109 
110  inline MurmurHash &append( const char *data, size_t numElements );
111  inline MurmurHash &append( const unsigned char *data, size_t numElements );
112  inline MurmurHash &append( const short *data, size_t numElements );
113  inline MurmurHash &append( const unsigned short *data, size_t numElements );
114  inline MurmurHash &append( const int *data, size_t numElements );
115  inline MurmurHash &append( const unsigned int *data, size_t numElements );
116  inline MurmurHash &append( const int64_t *data, size_t numElements );
117  inline MurmurHash &append( const uint64_t *data, size_t numElements );
118  inline MurmurHash &append( const half *data, size_t numElements );
119  inline MurmurHash &append( const float *data, size_t numElements );
120  inline MurmurHash &append( const double *data, size_t numElements );
121  inline MurmurHash &append( const std::string *data, size_t numElements );
122  inline MurmurHash &append( const InternedString *data, size_t numElements );
123  inline MurmurHash &append( const Imath::V2i *data, size_t numElements );
124  inline MurmurHash &append( const Imath::V2f *data, size_t numElements );
125  inline MurmurHash &append( const Imath::V2d *data, size_t numElements );
126  inline MurmurHash &append( const Imath::V3i *data, size_t numElements );
127  inline MurmurHash &append( const Imath::V3f *data, size_t numElements );
128  inline MurmurHash &append( const Imath::V3d *data, size_t numElements );
129  inline MurmurHash &append( const Imath::Color3f *data, size_t numElements );
130  inline MurmurHash &append( const Imath::Color3<double> *data, size_t numElements );
131  inline MurmurHash &append( const Imath::Color4f *data, size_t numElements );
132  inline MurmurHash &append( const Imath::Color4<double> *data, size_t numElements );
133  inline MurmurHash &append( const Imath::M33f *data, size_t numElements );
134  inline MurmurHash &append( const Imath::M33d *data, size_t numElements );
135  inline MurmurHash &append( const Imath::M44f *data, size_t numElements );
136  inline MurmurHash &append( const Imath::M44d *data, size_t numElements );
137  inline MurmurHash &append( const Imath::Box2i *data, size_t numElements );
138  inline MurmurHash &append( const Imath::Box2f *data, size_t numElements );
139  inline MurmurHash &append( const Imath::Box2d *data, size_t numElements );
140  inline MurmurHash &append( const Imath::Box3i *data, size_t numElements );
141  inline MurmurHash &append( const Imath::Box3f *data, size_t numElements );
142  inline MurmurHash &append( const Imath::Box3d *data, size_t numElements );
143  inline MurmurHash &append( const Imath::Quatf *data, size_t numElements );
144  inline MurmurHash &append( const Imath::Quatd *data, size_t numElements );
145 
146  inline const MurmurHash &operator = ( const MurmurHash &other );
147 
148  inline bool operator == ( const MurmurHash &other ) const;
149  inline bool operator != ( const MurmurHash &other ) const;
150 
151  inline bool operator < ( const MurmurHash &other ) const;
152 
153  std::string toString() const;
154 
155  private :
156 
157  inline void append( const void *data, size_t bytes, int elementSize );
158 
159  uint64_t m_h1;
160  uint64_t m_h2;
161 
162  friend size_t tbb_hasher( const MurmurHash &h );
163  friend size_t hash_value( const MurmurHash &h );
164 
165 };
166 
167 std::ostream &operator << ( std::ostream &o, const MurmurHash &hash );
168 
169 } // namespace IECore
170 
171 #include "IECore/MurmurHash.inl"
172 
173 #endif // IECORE_MURMURHASH_H
size_t tbb_hasher(const boost::intrusive_ptr< T > &ptr)
Definition: RefCounted.h:176
std::ostream & operator<<(std::ostream &os, const Imath::Box< T > &obj)
Streaming for Imath::Box types.
Definition: MurmurHash.h:64
Definition: InternedString.h:55
This namespace contains all components of the core library.
Definition: AddSmoothSkinningInfluencesOp.h:43