QtGlobal: (new) qEnvironmentVariableIs{Set,Empty}()
These functions are a faster version of {,!}qgetenv().is{Null,Empty}(),
a common pattern in Qt code.
Their main advantage is that they don't need to allocate memory, so
they can be used in noexcept functions, or dynamic initialisation of
namespace-scope statics, because throwing in these contexts invokes
std::terminate().
Change-Id: I651c5bd72f450b5d7df76590f8791572fe992af5
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
parent
977441f61c
commit
fa08b143f3
|
|
@ -2083,6 +2083,62 @@ QByteArray qgetenv(const char *varName)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
\relates <QtGlobal>
|
||||
\internal
|
||||
|
||||
This function checks whether the environment variable \a varName
|
||||
is empty.
|
||||
|
||||
Equivalent to
|
||||
\code
|
||||
qgetenv(varName).isEmpty()
|
||||
\endcode
|
||||
except that it's potentially much faster, and can't throw exceptions.
|
||||
|
||||
\sa qgetenv(), qEnvironmentVariableIsSet()
|
||||
*/
|
||||
bool qEnvironmentVariableIsEmpty(const char *varName) Q_DECL_NOEXCEPT
|
||||
{
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
// we provide a buffer that can only hold the empty string, so
|
||||
// when the env.var isn't empty, we'll get an ERANGE error (buffer
|
||||
// too small):
|
||||
size_t dummy;
|
||||
char buffer = '\0';
|
||||
return getenv_s(&dummy, &buffer, 1, varName) != ERANGE;
|
||||
#else
|
||||
const char * const value = ::getenv(varName);
|
||||
return !value || !*value;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
\relates <QtGlobal>
|
||||
\internal
|
||||
|
||||
This function checks whether the environment variable \a varName
|
||||
is set.
|
||||
|
||||
Equivalent to
|
||||
\code
|
||||
!qgetenv(varName).isNull()
|
||||
\endcode
|
||||
except that it's potentially much faster, and can't throw exceptions.
|
||||
|
||||
\sa qgetenv(), qEnvironmentVariableIsEmpty()
|
||||
*/
|
||||
bool qEnvironmentVariableIsSet(const char *varName) Q_DECL_NOEXCEPT
|
||||
{
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
size_t requiredSize = 0;
|
||||
(void)getenv_s(&requiredSize, 0, 0, varName);
|
||||
return requiredSize != 0;
|
||||
#else
|
||||
return ::getenv(varName) != 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
\relates <QtGlobal>
|
||||
|
||||
|
|
|
|||
|
|
@ -1055,6 +1055,9 @@ class QByteArray;
|
|||
Q_CORE_EXPORT QByteArray qgetenv(const char *varName);
|
||||
Q_CORE_EXPORT bool qputenv(const char *varName, const QByteArray& value);
|
||||
|
||||
Q_CORE_EXPORT bool qEnvironmentVariableIsEmpty(const char *varName) Q_DECL_NOEXCEPT;
|
||||
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) Q_DECL_NOEXCEPT;
|
||||
|
||||
inline int qIntCast(double f) { return int(f); }
|
||||
inline int qIntCast(float f) { return int(f); }
|
||||
|
||||
|
|
|
|||
|
|
@ -53,12 +53,27 @@ private slots:
|
|||
|
||||
void tst_QGetPutEnv::getSetCheck()
|
||||
{
|
||||
const char* varName = "should_not_exist";
|
||||
const char varName[] = "should_not_exist";
|
||||
|
||||
QVERIFY(!qEnvironmentVariableIsSet(varName));
|
||||
QVERIFY(qEnvironmentVariableIsEmpty(varName));
|
||||
QByteArray result = qgetenv(varName);
|
||||
QCOMPARE(result, QByteArray());
|
||||
|
||||
#ifndef Q_OS_WIN
|
||||
QVERIFY(qputenv(varName, "")); // deletes varName instead of making it empty, on Windows
|
||||
|
||||
QVERIFY(qEnvironmentVariableIsSet(varName));
|
||||
QVERIFY(qEnvironmentVariableIsEmpty(varName));
|
||||
#endif
|
||||
|
||||
QVERIFY(qputenv(varName, QByteArray("supervalue")));
|
||||
|
||||
QVERIFY(qEnvironmentVariableIsSet(varName));
|
||||
QVERIFY(!qEnvironmentVariableIsEmpty(varName));
|
||||
result = qgetenv(varName);
|
||||
QVERIFY(result == "supervalue");
|
||||
|
||||
qputenv(varName,QByteArray());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue