From Electron Cloud
Jump to: navigation, search
Line 18: Line 18:
 
==Find range of true values in a std::vector<bool>==
 
==Find range of true values in a std::vector<bool>==
  
 +
<pre>
 
std::vector<bool> m_vec;
 
std::vector<bool> m_vec;
  
Line 44: Line 45:
 
     return m_vec.rend() - found;
 
     return m_vec.rend() - found;
 
}
 
}
 +
</pre>

Revision as of 05:31, 15 June 2015

Stringify a define

If you would like to pass a string into a define via the compiler -D directive, but need to use it as if it was a quoted #define, it takes a pair of macros (verified to work on g++ and also Visual Studio):

#define STRINGIFY_IMPL(S) #S
#define STRINGIFY(s) STRINGIFY_IMPL(s)

then it can be used like this:

QFile uiFile(":" STRINGIFY(UI_FILE));

and in the .pro file if using Qt:

DEFINES += UI_FILE="some.ui"

so when it's compiled:

g++ foo.cpp -DUI_FILE=some.ui ...

(oh noes, it's DUI!)

Find range of true values in a std::vector<bool>

std::vector<bool> m_vec;

void update(int index, bool value)
{
    if (index < 0)
        return;
    if (uint(index) >= m_vec.size())
        m_vec.resize(index * 2 + 1);
    m_vec[index] = visible;
}

int firstTrueIndex() const
{
    auto found = std::find(m_vec.begin(), m_vec.end(), true);
    if (found == std::end(m_vec))
        return -1;
    return found - m_vec.begin();
}

int lastTrueIndex() const
{
    auto found = std::find(m_vec.rbegin(), m_vec.rend(), true);
    if (found == m_vec.rend())
        return -1;
    return m_vec.rend() - found;
}