mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: encapsulate wordRe regex with pointer
- reduces overall size and other overhead when wordRe represents a literal.
This commit is contained in:
@ -31,8 +31,8 @@ Description
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef regExp_H
|
#ifndef Foam_regExp_H
|
||||||
#define regExp_H
|
#define Foam_regExp_H
|
||||||
|
|
||||||
#include "regExpCxx.H"
|
#include "regExpCxx.H"
|
||||||
#include "regExpFwd.H"
|
#include "regExpFwd.H"
|
||||||
|
|||||||
@ -31,8 +31,8 @@ Description
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef regExpFwd_H
|
#ifndef Foam_regExpFwd_H
|
||||||
#define regExpFwd_H
|
#define Foam_regExpFwd_H
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -31,8 +31,8 @@ Description
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef regExp_H
|
#ifndef Foam_regExp_H
|
||||||
#define regExp_H
|
#define Foam_regExp_H
|
||||||
|
|
||||||
#include "regExpCxx.H"
|
#include "regExpCxx.H"
|
||||||
#include "regExpPosix.H"
|
#include "regExpPosix.H"
|
||||||
|
|||||||
@ -31,8 +31,8 @@ Description
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef regExpFwd_H
|
#ifndef Foam_regExpFwd_H
|
||||||
#define regExpFwd_H
|
#define Foam_regExpFwd_H
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -64,8 +64,8 @@ SourceFiles
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef regExpPosix_H
|
#ifndef Foam_regExpPosix_H
|
||||||
#define regExpPosix_H
|
#define Foam_regExpPosix_H
|
||||||
|
|
||||||
#include "regExpCxx.H"
|
#include "regExpCxx.H"
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|||||||
@ -65,8 +65,8 @@ SourceFiles
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef regExpCxx_H
|
#ifndef Foam_regExpCxx_H
|
||||||
#define regExpCxx_H
|
#define Foam_regExpCxx_H
|
||||||
|
|
||||||
#include <regex>
|
#include <regex>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2018-2021 OpenCFD Ltd.
|
Copyright (C) 2018-2022 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -40,7 +40,8 @@ const Foam::wordRe Foam::wordRe::null;
|
|||||||
|
|
||||||
Foam::wordRe::wordRe(const keyType& str)
|
Foam::wordRe::wordRe(const keyType& str)
|
||||||
:
|
:
|
||||||
word(str, false) // No stripping
|
word(str, false), // No stripping
|
||||||
|
regexPtr_(nullptr)
|
||||||
{
|
{
|
||||||
if (str.isPattern())
|
if (str.isPattern())
|
||||||
{
|
{
|
||||||
@ -50,6 +51,9 @@ Foam::wordRe::wordRe(const keyType& str)
|
|||||||
|
|
||||||
|
|
||||||
Foam::wordRe::wordRe(Istream& is)
|
Foam::wordRe::wordRe(Istream& is)
|
||||||
|
:
|
||||||
|
word(),
|
||||||
|
regexPtr_(nullptr)
|
||||||
{
|
{
|
||||||
is >> *this;
|
is >> *this;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2017-2021 OpenCFD Ltd.
|
Copyright (C) 2017-2022 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -51,8 +51,8 @@ SourceFiles
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef wordRe_H
|
#ifndef Foam_wordRe_H
|
||||||
#define wordRe_H
|
#define Foam_wordRe_H
|
||||||
|
|
||||||
#include "word.H"
|
#include "word.H"
|
||||||
#include "regExp.H"
|
#include "regExp.H"
|
||||||
@ -85,7 +85,7 @@ class wordRe
|
|||||||
// Private Member Data
|
// Private Member Data
|
||||||
|
|
||||||
//- The regular expression
|
//- The regular expression
|
||||||
regExp re_;
|
std::unique_ptr<Foam::regExp> regexPtr_;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -164,10 +164,10 @@ public:
|
|||||||
|
|
||||||
// Access
|
// Access
|
||||||
|
|
||||||
//- The wordRe is treated as literal string, not as pattern.
|
//- The wordRe is a literal string, not a pattern.
|
||||||
inline bool isLiteral() const noexcept;
|
inline bool isLiteral() const noexcept;
|
||||||
|
|
||||||
//- The wordRe is treated as a pattern, not as literal string.
|
//- The wordRe is a pattern, not a literal string.
|
||||||
inline bool isPattern() const noexcept;
|
inline bool isPattern() const noexcept;
|
||||||
|
|
||||||
|
|
||||||
@ -181,7 +181,7 @@ public:
|
|||||||
// \return false if the token was the incorrect type
|
// \return false if the token was the incorrect type
|
||||||
bool assign(const token& tok);
|
bool assign(const token& tok);
|
||||||
|
|
||||||
//- Compile as regular expression
|
//- Compile as regular expression (if possible)
|
||||||
inline bool compile();
|
inline bool compile();
|
||||||
|
|
||||||
//- Mark as literal string, remove any regular expression
|
//- Mark as literal string, remove any regular expression
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2017-2021 OpenCFD Ltd.
|
Copyright (C) 2017-2022 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -40,7 +40,7 @@ inline bool Foam::wordRe::valid(const char c)
|
|||||||
inline Foam::wordRe::wordRe()
|
inline Foam::wordRe::wordRe()
|
||||||
:
|
:
|
||||||
word(),
|
word(),
|
||||||
re_()
|
regexPtr_(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -58,25 +58,28 @@ inline Foam::wordRe::wordRe(const wordRe& str)
|
|||||||
inline Foam::wordRe::wordRe(wordRe&& str)
|
inline Foam::wordRe::wordRe(wordRe&& str)
|
||||||
:
|
:
|
||||||
word(std::move(static_cast<word&>(str))),
|
word(std::move(static_cast<word&>(str))),
|
||||||
re_(std::move(str.re_))
|
regexPtr_(str.regexPtr_.release())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::wordRe::wordRe(const word& str)
|
inline Foam::wordRe::wordRe(const word& str)
|
||||||
:
|
:
|
||||||
word(str)
|
word(str),
|
||||||
|
regexPtr_(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::wordRe::wordRe(word&& str)
|
inline Foam::wordRe::wordRe(word&& str)
|
||||||
:
|
:
|
||||||
word(std::move(str))
|
word(std::move(str)),
|
||||||
|
regexPtr_(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::wordRe::wordRe(const std::string& str, const compOption opt)
|
inline Foam::wordRe::wordRe(const std::string& str, const compOption opt)
|
||||||
:
|
:
|
||||||
word(str, false) // No stripping
|
word(str, false), // No stripping
|
||||||
|
regexPtr_(nullptr)
|
||||||
{
|
{
|
||||||
if (opt != wordRe::LITERAL)
|
if (opt != wordRe::LITERAL)
|
||||||
{
|
{
|
||||||
@ -87,7 +90,8 @@ inline Foam::wordRe::wordRe(const std::string& str, const compOption opt)
|
|||||||
|
|
||||||
inline Foam::wordRe::wordRe(const char* str, const compOption opt)
|
inline Foam::wordRe::wordRe(const char* str, const compOption opt)
|
||||||
:
|
:
|
||||||
word(str, false) // No stripping
|
word(str, false), // No stripping
|
||||||
|
regexPtr_(nullptr)
|
||||||
{
|
{
|
||||||
if (opt != wordRe::LITERAL)
|
if (opt != wordRe::LITERAL)
|
||||||
{
|
{
|
||||||
@ -100,13 +104,13 @@ inline Foam::wordRe::wordRe(const char* str, const compOption opt)
|
|||||||
|
|
||||||
inline bool Foam::wordRe::isLiteral() const noexcept
|
inline bool Foam::wordRe::isLiteral() const noexcept
|
||||||
{
|
{
|
||||||
return !re_.exists();
|
return !bool(regexPtr_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Foam::wordRe::isPattern() const noexcept
|
inline bool Foam::wordRe::isPattern() const noexcept
|
||||||
{
|
{
|
||||||
return re_.exists();
|
return bool(regexPtr_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -131,25 +135,47 @@ inline bool Foam::wordRe::compile(const compOption opt)
|
|||||||
|
|
||||||
if (comp)
|
if (comp)
|
||||||
{
|
{
|
||||||
return re_.set(*this, (opt & wordRe::ICASE));
|
if (!regexPtr_)
|
||||||
|
{
|
||||||
|
regexPtr_.reset(new Foam::regExp());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!regexPtr_->set(*this, (opt & wordRe::ICASE)))
|
||||||
|
{
|
||||||
|
// Compilation failed
|
||||||
|
regexPtr_.reset(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bool(regexPtr_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fall-through behaviour - not a regex
|
// Fall-through behaviour - not a regex
|
||||||
re_.clear();
|
regexPtr_.reset(nullptr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Foam::wordRe::compile()
|
inline bool Foam::wordRe::compile()
|
||||||
{
|
{
|
||||||
return re_.set(*this);
|
if (!regexPtr_)
|
||||||
|
{
|
||||||
|
regexPtr_.reset(new Foam::regExp());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!regexPtr_->set(*this))
|
||||||
|
{
|
||||||
|
// Compilation failed
|
||||||
|
regexPtr_.reset(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bool(regexPtr_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void Foam::wordRe::uncompile()
|
inline void Foam::wordRe::uncompile()
|
||||||
{
|
{
|
||||||
re_.clear();
|
regexPtr_.reset(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -160,22 +186,22 @@ inline void Foam::wordRe::uncompile(bool adjust)
|
|||||||
{
|
{
|
||||||
string::stripInvalid<word>(*this);
|
string::stripInvalid<word>(*this);
|
||||||
}
|
}
|
||||||
re_.clear();
|
regexPtr_.reset(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void Foam::wordRe::clear()
|
inline void Foam::wordRe::clear()
|
||||||
{
|
{
|
||||||
word::clear();
|
word::clear();
|
||||||
re_.clear();
|
regexPtr_.reset(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Foam::wordRe::match(const std::string& text, bool literal) const
|
inline bool Foam::wordRe::match(const std::string& text, bool literal) const
|
||||||
{
|
{
|
||||||
if (!literal && re_.exists())
|
if (!literal && regexPtr_)
|
||||||
{
|
{
|
||||||
return re_.match(text); // Match as regex
|
return regexPtr_->match(text); // Match as regex
|
||||||
}
|
}
|
||||||
|
|
||||||
return !compare(text); // Compare as literal
|
return !compare(text); // Compare as literal
|
||||||
@ -191,6 +217,7 @@ inline void Foam::wordRe::set(const std::string& str, const compOption opt)
|
|||||||
|
|
||||||
inline void Foam::wordRe::set(const char* str, const compOption opt)
|
inline void Foam::wordRe::set(const char* str, const compOption opt)
|
||||||
{
|
{
|
||||||
|
// No nullptr protection here
|
||||||
assign(str);
|
assign(str);
|
||||||
compile(opt);
|
compile(opt);
|
||||||
}
|
}
|
||||||
@ -204,7 +231,7 @@ inline void Foam::wordRe::swap(wordRe& str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
word::swap(static_cast<word&>(str));
|
word::swap(static_cast<word&>(str));
|
||||||
re_.swap(str.re_);
|
regexPtr_.swap(str.regexPtr_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -230,7 +257,7 @@ inline void Foam::wordRe::operator=(const wordRe& str)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
re_.clear();
|
regexPtr_.reset(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,7 +265,7 @@ inline void Foam::wordRe::operator=(const wordRe& str)
|
|||||||
inline void Foam::wordRe::operator=(const word& str)
|
inline void Foam::wordRe::operator=(const word& str)
|
||||||
{
|
{
|
||||||
assign(str);
|
assign(str);
|
||||||
re_.clear();
|
regexPtr_.reset(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user