This will not work in every case because you cannot guarantee that your
hash function generates a unique value for every string. In hash based
containers you still have to compare against the valueof the string.
Am 24.08.2015 01:27 schrieb "mark diener" <rpzrpz...@gmail.com>:

> Hello List:
>
> Have you ever wanted an efficient switch statement on QString values?
>
> There are many references to the subject with various algorithms, but they
> all have some major flaw in the implementation.
>
> For those looking for a way to have compile and run time hash on their
> strings, I spent a little while doing some research on the subject and
> wanted to share back to Qt community:
>
> The tests ran successfully with the C++11 example for OSX/IOS Xcode 6.3.2
> and Android NDK 10 r10e,
>
> I went ahead and tested the function on MSVC 2013 with CTP November and it
> failed.  MSVC 2015 worked, but I could not build the QT 5.5.0 source code
> successfully, so I just built a console app in MSVC2015 and the C++11
> function worked.
>
> The C++14 example did not work on OSX or Android, but it did work on IOS.
> With 2 out of 3 failures, I did not feel motivated to test for MSVC 2015 on
> Windows 10.
>
> So for those wanting to verify and make use of it, here are the required
> code snippets:
>
> First, in your .PRO file:
>
> #CONFIG += c++14
>
> CONFIG += c++11
>
>
> Now for a source sample:
>
>
> //main.cpp ######################//VALID C++14 Constant Expression Function 
> (Compiles for IOS on Qt5.5.0 and XCode 6.3.2, but does not Compile for OSX 
> Desktop with Clang)/*constexpr unsigned int fnhash(const char *gpstr){    
> unsigned int hash = 0;    size_t gidx = 0 ;    while (gpstr[gidx] > 0)    {   
>      hash = 65599 * hash + gpstr[gidx];        if (gidx > 15) break ;        
> gidx++ ;    }    return hash ^ (hash >> 16);}*/// 
> ######################//C++11 Constant Expression Function
> //Forward declarationconstexpr unsigned int fnhashrec(unsigned int hash, 
> const char* str) ;
> constexpr unsigned int fnhash(const char* str){   return ( !str ? 0 : 
> fnhashrec(5381, str) );}
> constexpr unsigned int fnhashrec(unsigned int hash, const char* str){   
> return ( !*str ? hash : fnhashrec(((hash << 5) + hash) + *str, str + 1));}// 
> ######################
> int main(int argc, char *argv[]){    QGuiApplication gapp(argc, argv);    
> QQmlApplicationEngine geng;
>     QString gval = "JOKER" ;
>
>     //NOW look at the run time eval from QString -> char*
>
>     switch (fnhash(gval.toUtf8().data()))    {    case fnhash("PETE"):  
> //Compile time optimized        qDebug() << "POOR PETE IS NOT A JOKER" << 
> endl ;        break ;    case fnhash("JOKER"): //Compile time optimized       
>  qDebug() << "BLOODY JOKER WORKED -> SUCCESS" << endl ;        break ;    }
>     geng.load(QUrl(QStringLiteral("qrc:/main.qml")));    return gapp.exec();}
>
> Cheers,
>
> md
>
>
>
> _______________________________________________
> Interest mailing list
> Interest@qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to