236 lines
7.1 KiB
C
236 lines
7.1 KiB
C
![]() |
/*
|
|||
|
<pre>
|
|||
|
__________ ____ ___
|
|||
|
_____ __ _\______ \_____ _______ ______ __________\ \/ /
|
|||
|
/ \| | \ ___/\__ \\_ __ \/ ___// __ \_ __ \ /
|
|||
|
| Y Y \ | / | / __ \| | \/\___ \\ ___/| | \/ \
|
|||
|
|__|_| /____/|____| (____ /__| /____ >\___ >__| /___/\ \
|
|||
|
\/ \/ \/ \/ \_/
|
|||
|
Copyright (C) 2016 Ingo Berg
|
|||
|
All rights reserved.
|
|||
|
|
|||
|
muParserX - A C++ math parser library with array and string support
|
|||
|
Copyright (c) 2016, Ingo Berg
|
|||
|
All rights reserved.
|
|||
|
|
|||
|
Redistribution and use in source and binary forms, with or without
|
|||
|
modification, are permitted provided that the following conditions are met:
|
|||
|
|
|||
|
* Redistributions of source code must retain the above copyright notice,
|
|||
|
this list of conditions and the following disclaimer.
|
|||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|||
|
this list of conditions and the following disclaimer in the documentation
|
|||
|
and/or other materials provided with the distribution.
|
|||
|
|
|||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|||
|
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|||
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|||
|
POSSIBILITY OF SUCH DAMAGE.
|
|||
|
</pre>
|
|||
|
*/
|
|||
|
#ifndef MUP_ITOKEN_H
|
|||
|
#define MUP_ITOKEN_H
|
|||
|
|
|||
|
#include <list>
|
|||
|
#include "mpTypes.h"
|
|||
|
#include "mpFwdDecl.h"
|
|||
|
|
|||
|
MUP_NAMESPACE_START
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
/** \brief Generic token interface for expression tokens.
|
|||
|
\author (C) 2010 Ingo Berg
|
|||
|
|
|||
|
Tokens can either be Functions, operators, values, variables or necessary
|
|||
|
base tokens like brackets. ´The IToken baseclass implements reference
|
|||
|
counting. Only TokenPtr<...> templates may be used as pointers to tokens.
|
|||
|
*/
|
|||
|
class IToken
|
|||
|
{
|
|||
|
friend std::ostream& operator<<(std::ostream &a_Stream, const IToken &a_Val);
|
|||
|
friend std::wostream& operator<<(std::wostream &a_Stream, const IToken &a_Val);
|
|||
|
|
|||
|
friend class TokenPtr<IToken>;
|
|||
|
friend class TokenPtr<IValue>;
|
|||
|
friend class TokenPtr<IOprtBin>;
|
|||
|
friend class TokenPtr<IOprtInfix>;
|
|||
|
friend class TokenPtr<IOprtPostfix>;
|
|||
|
friend class TokenPtr<IFunction>;
|
|||
|
friend class TokenPtr<Value>;
|
|||
|
friend class TokenPtr<Variable>;
|
|||
|
friend class TokenPtr<ICallback>;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
enum EFlags
|
|||
|
{
|
|||
|
flNONE = 0,
|
|||
|
flVOLATILE = 1
|
|||
|
};
|
|||
|
|
|||
|
virtual IToken* Clone() const = 0;
|
|||
|
virtual string_type ToString() const;
|
|||
|
virtual string_type AsciiDump() const;
|
|||
|
|
|||
|
virtual ICallback* AsICallback();
|
|||
|
virtual IValue* AsIValue();
|
|||
|
virtual IPrecedence* AsIPrecedence();
|
|||
|
|
|||
|
virtual void Compile(const string_type &sArg);
|
|||
|
|
|||
|
ECmdCode GetCode() const;
|
|||
|
int GetExprPos() const;
|
|||
|
|
|||
|
const string_type& GetIdent() const;
|
|||
|
long GetRef() const;
|
|||
|
void SetIdent(const string_type &a_sIdent);
|
|||
|
void SetExprPos(int nPos);
|
|||
|
|
|||
|
void AddFlags(int flags);
|
|||
|
bool IsFlagSet(int flags) const;
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
explicit IToken(ECmdCode a_iCode);
|
|||
|
virtual ~IToken();
|
|||
|
IToken(ECmdCode a_iCode, string_type a_sIdent);
|
|||
|
IToken(const IToken &ref);
|
|||
|
|
|||
|
void ResetRef();
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
/** \brief Release the token.
|
|||
|
|
|||
|
This Function either deletes the token or releases it to
|
|||
|
the value cache for reuse without deletion.
|
|||
|
*/
|
|||
|
virtual void Release();
|
|||
|
|
|||
|
void IncRef() const;
|
|||
|
long DecRef() const;
|
|||
|
|
|||
|
ECmdCode m_eCode;
|
|||
|
string_type m_sIdent;
|
|||
|
int m_nPosExpr; ///< Original position of the token in the expression
|
|||
|
mutable long m_nRefCount; ///< Reference counter.
|
|||
|
int m_flags;
|
|||
|
|
|||
|
#ifdef MUP_LEAKAGE_REPORT
|
|||
|
static std::list<IToken*> s_Tokens;
|
|||
|
|
|||
|
public:
|
|||
|
static void LeakageReport();
|
|||
|
#endif
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
/** \brief Default token implentation.
|
|||
|
*/
|
|||
|
class GenericToken : public IToken
|
|||
|
{
|
|||
|
public:
|
|||
|
GenericToken(ECmdCode a_iCode, string_type a_sIdent);
|
|||
|
explicit GenericToken(ECmdCode a_iCode);
|
|||
|
GenericToken(const GenericToken &a_Tok);
|
|||
|
virtual ~GenericToken();
|
|||
|
virtual IToken* Clone() const;
|
|||
|
virtual string_type AsciiDump() const;
|
|||
|
};
|
|||
|
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
template<typename T>
|
|||
|
class TokenPtr
|
|||
|
{
|
|||
|
public:
|
|||
|
|
|||
|
typedef T* token_type;
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
TokenPtr(token_type p = 0)
|
|||
|
:m_pTok(p)
|
|||
|
{
|
|||
|
if (m_pTok)
|
|||
|
m_pTok->IncRef();
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
TokenPtr(const TokenPtr &p)
|
|||
|
:m_pTok(p.m_pTok)
|
|||
|
{
|
|||
|
if (m_pTok)
|
|||
|
m_pTok->IncRef();
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
~TokenPtr()
|
|||
|
{
|
|||
|
if (m_pTok && m_pTok->DecRef()==0)
|
|||
|
m_pTok->Release();
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
token_type operator->() const
|
|||
|
{
|
|||
|
return static_cast<token_type>(m_pTok);
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
T& operator*() const
|
|||
|
{
|
|||
|
assert(m_pTok);
|
|||
|
return *(static_cast<token_type>(m_pTok));
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
token_type Get() const
|
|||
|
{
|
|||
|
return static_cast<token_type>(m_pTok);
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
/** \brief Release the managed pointer and assign a new pointer. */
|
|||
|
void Reset(token_type tok)
|
|||
|
{
|
|||
|
if (m_pTok && m_pTok->DecRef()==0)
|
|||
|
{
|
|||
|
m_pTok->Release();
|
|||
|
//delete m_pTok;
|
|||
|
}
|
|||
|
|
|||
|
tok->IncRef();
|
|||
|
m_pTok = tok;
|
|||
|
}
|
|||
|
|
|||
|
//---------------------------------------------------------------------------
|
|||
|
TokenPtr& operator=(const TokenPtr &p)
|
|||
|
{
|
|||
|
if (p.m_pTok)
|
|||
|
p.m_pTok->IncRef();
|
|||
|
|
|||
|
if (m_pTok && m_pTok->DecRef()==0)
|
|||
|
{
|
|||
|
m_pTok->Release();
|
|||
|
//delete m_pTok;
|
|||
|
}
|
|||
|
|
|||
|
m_pTok = p.m_pTok;
|
|||
|
|
|||
|
return *this;
|
|||
|
}
|
|||
|
|
|||
|
private:
|
|||
|
IToken *m_pTok;
|
|||
|
};
|
|||
|
|
|||
|
MUP_NAMESPACE_END
|
|||
|
|
|||
|
#endif // include guard
|