Commit d4024e56 authored by Hugo Beauzée-Luyssen's avatar Hugo Beauzée-Luyssen
Browse files

utils: Add a StringKey helper class

This will allow heterogeneous lookups in std::unordered_map in order to
remove the need of creating a temporary string each time we perform a
lookup with a const char*
parent 15eea085
......@@ -53,6 +53,8 @@ medialib_src = [
'Bookmark.cpp',
'MediaGroup.cpp',
'utils/XxHasher.cpp',
'utils/xxhash/xxh_x86dispatch.cpp',
'utils/StringKey.cpp',
]
if host_machine.cpu_family() == 'x86' or host_machine.cpu_family() == 'x86_64'
......
/*****************************************************************************
* Media Library
*****************************************************************************
* Copyright (C) 2021 Hugo Beauzée-Luyssen, Videolabs, VideoLAN
*
* Authors: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "StringKey.h"
namespace medialibrary
{
namespace utils
{
StringKey::StringKey( std::string k )
: m_key( std::move( k ) )
, m_cstr( nullptr )
{
}
StringKey::StringKey( const char* cstr ) noexcept
: m_cstr( cstr )
{
}
bool StringKey::operator==( const StringKey& sk ) const
{
if ( sk.m_cstr != nullptr )
{
if ( m_cstr != nullptr )
return strcmp( sk.m_cstr, m_cstr ) == 0;
return m_key.compare( sk.m_cstr ) == 0;
}
assert( sk.m_cstr == nullptr );
if ( m_cstr != nullptr )
return sk.m_key.compare( m_cstr ) == 0;
return m_key == sk.m_key;
}
}
}
/*****************************************************************************
* Media Library
*****************************************************************************
* Copyright (C) 2021 Hugo Beauzée-Luyssen, Videolabs, VideoLAN
*
* Authors: Hugo Beauzée-Luyssen <hugo@beauzee.fr>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#pragma once
#include <string>
#include <functional>
#include <cassert>
#include <cstring>
#include "utils/XxHasher.h"
namespace medialibrary
{
namespace utils
{
/**
* @brief The StringKey class is a wrapper around a std::string to allow
* heterogeneous lookups in associated containers.
* This also leverages xxhash instead of the default hash function
*/
class StringKey
{
public:
StringKey( std::string k );
StringKey( const char* cstr ) noexcept;
bool operator==( const StringKey& sk ) const;
private:
std::string m_key;
const char* m_cstr;
friend struct std::hash<StringKey>;
};
}
}
namespace std
{
template <>
struct hash<medialibrary::utils::StringKey>
{
size_t operator()( const medialibrary::utils::StringKey& k ) const noexcept
{
namespace hash = medialibrary::utils::hash;
if ( k.m_cstr != nullptr )
return hash::xxFromBuff( reinterpret_cast<const uint8_t*>( k.m_cstr ),
strlen( k.m_cstr ) );
return hash::xxFromBuff( reinterpret_cast<const uint8_t*>( k.m_key.c_str() ),
k.m_key.length() );
}
};
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment