X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fcontainer%2Fdetails%2Ffeldman_hashmap_base.h;h=9535cb5f8a74a3a1175669090769d7e19fd42894;hb=f9a3482c25de1eb0db20e2835488096ac23b2098;hp=d1963f327a1e9b96136ef649c43c9853754f10e1;hpb=cd515d6402be81b84e2eb0c9d4cf0a1ca9e4d95a;p=libcds.git diff --git a/cds/container/details/feldman_hashmap_base.h b/cds/container/details/feldman_hashmap_base.h index d1963f32..9535cb5f 100644 --- a/cds/container/details/feldman_hashmap_base.h +++ b/cds/container/details/feldman_hashmap_base.h @@ -5,7 +5,7 @@ Source code repo: http://github.com/khizmax/libcds/ Download: http://sourceforge.net/projects/libcds/files/ - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -25,7 +25,7 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CDSLIB_CONTAINER_DETAILS_FELDMAN_HASHMAP_BASE_H @@ -54,6 +54,14 @@ namespace cds { namespace container { /// \p FeldmanHashMap level statistics typedef cds::intrusive::feldman_hashset::level_statistics level_statistics; + /// Key size option + /** + @copydetails cds::container::feldman_hashmap::traits::hash_size + */ + template + using hash_size = cds::intrusive::feldman_hashset::hash_size< Size >; + + /// \p FeldmanHashMap traits struct traits { @@ -65,7 +73,7 @@ namespace cds { namespace container { CityHash or its successor FarmHash. - If you use a fixed-sized key you may use it directly instead of a hash. + If you use a fixed-sized key you can use it directly instead of a hash. In such case \p %traits::hash should be specified as \p opt::none. However, if you want to use the hash values or if your key type is not fixed-sized you must specify a proper hash functor in your traits. @@ -122,6 +130,28 @@ namespace cds { namespace container { */ typedef opt::none hash; + /// The size of hash value in bytes + /** + By default, the size of hash value is sizeof( hash_type ) + where \p hash_type is type of \p hash() result or sizeof( key ) if you use fixed-sized key. + + Sometimes that size is wrong, for example, for that 6-byte key: + \code + struct key_type { + uint32_t key; + uint16_t subkey; + }; + + static_assert( sizeof( key_type ) == 6, "Key type size mismatch" ); + \endcode + Here sizeof( key_type ) == 8 so \p static_assert will be thrown. + + For that case you can specify \p hash_size explicitly. + + Value \p 0 means auto-calculated sizeof( key_type ). + */ + static CDS_CONSTEXPR size_t const hash_size = 0; + /// Hash comparing functor /** @copydetails cds::intrusive::feldman_hashset::traits::compare @@ -179,6 +209,8 @@ namespace cds { namespace container { Supported \p Options are: - \p opt::hash - a hash functor, default is \p std::hash @copydetails traits::hash + - \p feldman_hashmap::hash_size - the size of hash value in bytes. + @copydetails traits::hash_size - \p opt::allocator - item allocator @copydetails traits::allocator - \p opt::node_allocator - array node allocator. @@ -290,19 +322,9 @@ namespace cds { namespace container { node_type() = delete; node_type(node_type const&) = delete; - template - node_type(hasher /*h*/, Q const& key) - : m_Value(std::move(std::make_pair(key, mapped_type()))) - {} - - template - node_type(hasher /*h*/, Q const& key, U const& val) - : m_Value(std::move(std::make_pair(key, mapped_type(val)))) - {} - template - node_type(hasher /*h*/, Q&& key, Args&&... args) - : m_Value(std::move(std::make_pair(std::forward(key), std::move(mapped_type(std::forward(args)...))))) + node_type( hasher /*h*/, Q&& key, Args&&... args ) + : m_Value( std::make_pair( key_type( std::forward( key )), mapped_type( std::forward(args)...))) {} };