[colobot] 101/145: Refactored CBotVar to templates
Didier Raboud
odyx at moszumanska.debian.org
Mon Jul 11 12:56:22 UTC 2016
This is an automated email from the git hooks/post-receive script.
odyx pushed a commit to branch debian/master
in repository colobot.
commit df111dbf98eb76395e7d0c1b385120bb16620487
Author: krzys-h <krzys_h at interia.pl>
Date: Sat May 28 22:59:34 2016 +0200
Refactored CBotVar to templates
---
src/CBot/CBotVar/CBotVar.cpp | 17 ++-
src/CBot/CBotVar/CBotVar.h | 5 +
src/CBot/CBotVar/CBotVarBoolean.cpp | 118 +-----------------
src/CBot/CBotVar/CBotVarBoolean.h | 24 +---
src/CBot/CBotVar/CBotVarFloat.cpp | 196 -----------------------------
src/CBot/CBotVar/CBotVarFloat.h | 39 +-----
src/CBot/CBotVar/CBotVarInt.cpp | 237 ++++--------------------------------
src/CBot/CBotVar/CBotVarInt.h | 36 ++----
src/CBot/CBotVar/CBotVarString.cpp | 98 +--------------
src/CBot/CBotVar/CBotVarString.h | 52 +++++---
src/CBot/CBotVar/CBotVarValue.h | 177 +++++++++++++++++++++++++++
src/CBot/CMakeLists.txt | 1 +
12 files changed, 284 insertions(+), 716 deletions(-)
diff --git a/src/CBot/CBotVar/CBotVar.cpp b/src/CBot/CBotVar/CBotVar.cpp
index 8876ded..fc4503e 100644
--- a/src/CBot/CBotVar/CBotVar.cpp
+++ b/src/CBot/CBotVar/CBotVar.cpp
@@ -61,6 +61,11 @@ CBotVar::CBotVar( )
m_mPrivate = ProtectionLevel::Public;
}
+CBotVar::CBotVar(const CBotToken &name) : CBotVar()
+{
+ m_token = new CBotToken(name);
+}
+
////////////////////////////////////////////////////////////////////////////////
CBotVar::~CBotVar( )
{
@@ -698,7 +703,16 @@ void CBotVar::Dec()
////////////////////////////////////////////////////////////////////////////////
void CBotVar::Copy(CBotVar* pSrc, bool bName)
{
- assert(0);
+ if (bName) *m_token = *pSrc->m_token;
+ m_type = pSrc->m_type;
+ m_binit = pSrc->m_binit;
+//- m_bStatic = pSrc->m_bStatic;
+ m_next = nullptr;
+ m_pMyThis = nullptr;//p->m_pMyThis;
+ m_pUserPtr = pSrc->m_pUserPtr;
+
+ // keeps indentificator the same (by default)
+ if (m_ident == 0) m_ident = pSrc->m_ident;
}
////////////////////////////////////////////////////////////////////////////////
@@ -727,4 +741,5 @@ CBotClass* CBotVar::GetClass()
return nullptr;
}
+
} // namespace CBot
diff --git a/src/CBot/CBotVar/CBotVar.h b/src/CBot/CBotVar/CBotVar.h
index a4563b4..be17178 100644
--- a/src/CBot/CBotVar/CBotVar.h
+++ b/src/CBot/CBotVar/CBotVar.h
@@ -51,6 +51,11 @@ public:
CBotVar();
/**
+ * \brief Constructor. Do not call directly, use CBotVar::Create()
+ */
+ CBotVar(const CBotToken& name);
+
+ /**
* \brief Destructor. Do not call directly, use CBotVar::Destroy()
*/
virtual ~CBotVar();
diff --git a/src/CBot/CBotVar/CBotVarBoolean.cpp b/src/CBot/CBotVar/CBotVarBoolean.cpp
index 3a40772..c9a9b52 100644
--- a/src/CBot/CBotVar/CBotVarBoolean.cpp
+++ b/src/CBot/CBotVar/CBotVarBoolean.cpp
@@ -19,137 +19,27 @@
#include "CBot/CBotVar/CBotVarBoolean.h"
-#include "CBot/CBotEnums.h"
-#include "CBot/CBotUtils.h"
-
-#include "CBot/CBotToken.h"
-
namespace CBot
{
-////////////////////////////////////////////////////////////////////////////////
-CBotVarBoolean::CBotVarBoolean(const CBotToken& name)
-{
- m_token = new CBotToken(name);
- m_next = nullptr;
- m_pMyThis = nullptr;
- m_pUserPtr = nullptr;
- m_InitExpr = nullptr;
- m_LimExpr = nullptr;
- m_type = CBotTypBoolean;
- m_binit = InitType::UNDEF;
- m_bStatic = false;
- m_mPrivate = ProtectionLevel::Public;
- m_val = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarBoolean::Copy(CBotVar* pSrc, bool bName)
-{
- CBotVarBoolean* p = static_cast<CBotVarBoolean*>(pSrc);
-
- if (bName) *m_token = *p->m_token;
- m_type = p->m_type;
- m_val = p->m_val;
- m_binit = p->m_binit;
-//- m_bStatic = p->m_bStatic;
- m_next = nullptr;
- m_pMyThis = nullptr;//p->m_pMyThis;
- m_pUserPtr = p->m_pUserPtr;
-
- // keeps indentificator the same (by default)
- if (m_ident == 0 ) m_ident = p->m_ident;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarBoolean::SetValInt(int val, const std::string& s)
-{
- m_val = static_cast<bool>(val);
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarBoolean::SetValFloat(float val)
-{
- m_val = static_cast<bool>(val);
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int CBotVarBoolean::GetValInt()
-{
- return m_val;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float CBotVarBoolean::GetValFloat()
-{
- return static_cast<float>(m_val);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string CBotVarBoolean::GetValString()
-{
- std::string ret;
-
- std::string res;
-
- if ( m_binit == CBotVar::InitType::UNDEF )
- {
- res = LoadString(TX_UNDEF);
- return res;
- }
- if ( m_binit == CBotVar::InitType::IS_NAN )
- {
- res = LoadString(TX_NAN);
- return res;
- }
-
- ret = LoadString( m_val > 0 ? ID_TRUE : ID_FALSE );
- return ret;
-}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarBoolean::And(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() && right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() && right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarBoolean::Or(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() || right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() || right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarBoolean::XOr(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() ^ right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() ^ right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarBoolean::Not()
{
- m_val = m_val ? false : true ;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarBoolean::Eq(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() == right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarBoolean::Ne(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() != right->GetValInt();
+ SetValInt(!GetValInt());
}
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarBoolean::Save1State(FILE* pf)
{
return WriteWord(pf, m_val); // the value of the variable
diff --git a/src/CBot/CBotVar/CBotVarBoolean.h b/src/CBot/CBotVar/CBotVarBoolean.h
index 6fee80a..34f627b 100644
--- a/src/CBot/CBotVar/CBotVarBoolean.h
+++ b/src/CBot/CBotVar/CBotVarBoolean.h
@@ -19,7 +19,7 @@
#pragma once
-#include "CBot/CBotVar/CBotVar.h"
+#include "CBot/CBotVar/CBotVarValue.h"
namespace CBot
{
@@ -27,35 +27,17 @@ namespace CBot
/**
* \brief CBotVar subclass for managing boolean values (::CBotTypBoolean)
*/
-class CBotVarBoolean : public CBotVar
+class CBotVarBoolean : public CBotVarNumberBase<bool, CBotTypBoolean>
{
public:
- /**
- * \brief Constructor. Do not call directly, use CBotVar::Create()
- */
- CBotVarBoolean(const CBotToken& name);
-
- void SetValInt(int val, const std::string& s = nullptr) override;
- void SetValFloat(float val) override;
- int GetValInt() override;
- float GetValFloat() override;
- std::string GetValString() override;
-
- void Copy(CBotVar* pSrc, bool bName = true) override;
+ CBotVarBoolean(const CBotToken &name) : CBotVarNumberBase(name) {}
void And(CBotVar* left, CBotVar* right) override;
void Or(CBotVar* left, CBotVar* right) override;
void XOr(CBotVar* left, CBotVar* right) override;
void Not() override;
- bool Eq(CBotVar* left, CBotVar* right) override;
- bool Ne(CBotVar* left, CBotVar* right) override;
-
bool Save1State(FILE* pf) override;
-
-private:
- //! The value.
- bool m_val;
};
} // namespace CBot
diff --git a/src/CBot/CBotVar/CBotVarFloat.cpp b/src/CBot/CBotVar/CBotVarFloat.cpp
index ca178a3..ae90966 100644
--- a/src/CBot/CBotVar/CBotVarFloat.cpp
+++ b/src/CBot/CBotVar/CBotVarFloat.cpp
@@ -19,205 +19,9 @@
#include "CBot/CBotVar/CBotVarFloat.h"
-#include "CBot/CBotEnums.h"
-#include "CBot/CBotToken.h"
-
-#include "CBot/CBotUtils.h"
-
-#include <cmath>
-
namespace CBot
{
-////////////////////////////////////////////////////////////////////////////////
-CBotVarFloat::CBotVarFloat(const CBotToken& name)
-{
- m_token = new CBotToken(name);
- m_next = nullptr;
- m_pMyThis = nullptr;
- m_pUserPtr = nullptr;
- m_InitExpr = nullptr;
- m_LimExpr = nullptr;
- m_type = CBotTypFloat;
- m_binit = InitType::UNDEF;
- m_bStatic = false;
- m_mPrivate = ProtectionLevel::Public;
-
- m_val = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Copy(CBotVar* pSrc, bool bName)
-{
- CBotVarFloat* p = static_cast<CBotVarFloat*>(pSrc);
-
- if (bName) *m_token = *p->m_token;
- m_type = p->m_type;
- m_val = p->m_val;
- m_binit = p->m_binit;
-//- m_bStatic = p->m_bStatic;
- m_next = nullptr;
- m_pMyThis = nullptr;//p->m_pMyThis;
- m_pUserPtr = p->m_pUserPtr;
-
- // keeps indentificator the same (by default)
- if (m_ident == 0 ) m_ident = p->m_ident;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::SetValInt(int val, const std::string& s)
-{
- m_val = static_cast<float>(val);
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::SetValFloat(float val)
-{
- m_val = val;
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int CBotVarFloat::GetValInt()
-{
- return static_cast<int>(m_val);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float CBotVarFloat::GetValFloat()
-{
- return m_val;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string CBotVarFloat::GetValString()
-{
- std::string res;
-
- if ( m_binit == CBotVar::InitType::UNDEF )
- {
- return LoadString(TX_UNDEF);
- }
- if ( m_binit == CBotVar::InitType::IS_NAN )
- {
- return LoadString(TX_NAN);
- }
-
- char buffer[300];
- sprintf(buffer, "%.2f", m_val);
- res = buffer;
-
- return res;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Mul(CBotVar* left, CBotVar* right)
-{
- m_val = left->GetValFloat() * right->GetValFloat();
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Power(CBotVar* left, CBotVar* right)
-{
- m_val = static_cast<float>(pow( left->GetValFloat() , right->GetValFloat() ));
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-CBotError CBotVarFloat::Div(CBotVar* left, CBotVar* right)
-{
- float r = right->GetValFloat();
- if ( r != 0 )
- {
- m_val = left->GetValFloat() / r;
- m_binit = CBotVar::InitType::DEF;
- }
- return ( r == 0 ? CBotErrZeroDiv : CBotNoErr );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-CBotError CBotVarFloat::Modulo(CBotVar* left, CBotVar* right)
-{
- float r = right->GetValFloat();
- if ( r != 0 )
- {
- m_val = static_cast<float>(fmod( left->GetValFloat() , r ));
- m_binit = CBotVar::InitType::DEF;
- }
- return ( r == 0 ? CBotErrZeroDiv : CBotNoErr );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Add(CBotVar* left, CBotVar* right)
-{
- m_val = left->GetValFloat() + right->GetValFloat();
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Sub(CBotVar* left, CBotVar* right)
-{
- m_val = left->GetValFloat() - right->GetValFloat();
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Neg()
-{
- m_val = -m_val;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Inc()
-{
- m_val++;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarFloat::Dec()
-{
- m_val--;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarFloat::Lo(CBotVar* left, CBotVar* right)
-{
- return left->GetValFloat() < right->GetValFloat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarFloat::Hi(CBotVar* left, CBotVar* right)
-{
- return left->GetValFloat() > right->GetValFloat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarFloat::Ls(CBotVar* left, CBotVar* right)
-{
- return left->GetValFloat() <= right->GetValFloat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarFloat::Hs(CBotVar* left, CBotVar* right)
-{
- return left->GetValFloat() >= right->GetValFloat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarFloat::Eq(CBotVar* left, CBotVar* right)
-{
- return left->GetValFloat() == right->GetValFloat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarFloat::Ne(CBotVar* left, CBotVar* right)
-{
- return left->GetValFloat() != right->GetValFloat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarFloat::Save1State(FILE* pf)
{
return WriteFloat(pf, m_val); // the value of the variable
diff --git a/src/CBot/CBotVar/CBotVarFloat.h b/src/CBot/CBotVar/CBotVarFloat.h
index 0e29486..84324e6 100644
--- a/src/CBot/CBotVar/CBotVarFloat.h
+++ b/src/CBot/CBotVar/CBotVarFloat.h
@@ -19,7 +19,7 @@
#pragma once
-#include "CBot/CBotVar/CBotVar.h"
+#include "CBot/CBotVar/CBotVarValue.h"
namespace CBot
{
@@ -27,45 +27,12 @@ namespace CBot
/**
* \brief CBotVar subclass for managing float values (::CBotTypFloat)
*/
-class CBotVarFloat : public CBotVar
+class CBotVarFloat : public CBotVarNumber<float, CBotTypFloat>
{
public:
- /**
- * \brief Constructor. Do not call directly, use CBotVar::Create()
- */
- CBotVarFloat(const CBotToken& name);
-
- void SetValInt(int val, const std::string& s = nullptr) override;
- void SetValFloat(float val) override;
- int GetValInt() override;
- float GetValFloat() override;
- std::string GetValString() override;
-
- void Copy(CBotVar* pSrc, bool bName = true) override;
-
- void Add(CBotVar* left, CBotVar* right) override;
- void Sub(CBotVar* left, CBotVar* right) override;
- void Mul(CBotVar* left, CBotVar* right) override;
- CBotError Div(CBotVar* left, CBotVar* right) override;
- CBotError Modulo(CBotVar* left, CBotVar* right) override;
- void Power(CBotVar* left, CBotVar* right) override;
-
- bool Lo(CBotVar* left, CBotVar* right) override;
- bool Hi(CBotVar* left, CBotVar* right) override;
- bool Ls(CBotVar* left, CBotVar* right) override;
- bool Hs(CBotVar* left, CBotVar* right) override;
- bool Eq(CBotVar* left, CBotVar* right) override;
- bool Ne(CBotVar* left, CBotVar* right) override;
-
- void Neg() override;
- void Inc() override;
- void Dec() override;
+ CBotVarFloat(const CBotToken &name) : CBotVarNumber(name) {}
bool Save1State(FILE* pf) override;
-
-private:
- //! The value.
- float m_val;
};
} // namespace CBot
diff --git a/src/CBot/CBotVar/CBotVarInt.cpp b/src/CBot/CBotVar/CBotVarInt.cpp
index 0070490..29715c9 100644
--- a/src/CBot/CBotVar/CBotVarInt.cpp
+++ b/src/CBot/CBotVar/CBotVarInt.cpp
@@ -19,276 +19,93 @@
#include "CBot/CBotVar/CBotVarInt.h"
-#include "CBot/CBotEnums.h"
-#include "CBot/CBotToken.h"
-#include "CBot/CBotUtils.h"
-
-#include <cmath>
-
namespace CBot
{
-////////////////////////////////////////////////////////////////////////////////
-CBotVarInt::CBotVarInt(const CBotToken& name)
-{
- m_token = new CBotToken(name);
- m_next = nullptr;
- m_pMyThis = nullptr;
- m_pUserPtr = nullptr;
- m_InitExpr = nullptr;
- m_LimExpr = nullptr;
- m_type = CBotTypInt;
- m_binit = InitType::UNDEF;
- m_bStatic = false;
- m_mPrivate = ProtectionLevel::Public;
-
- m_val = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::Copy(CBotVar* pSrc, bool bName)
{
- CBotVarInt* p = static_cast<CBotVarInt*>(pSrc);
-
- if ( bName) *m_token = *p->m_token;
- m_type = p->m_type;
- m_val = p->m_val;
- m_binit = p->m_binit;
- m_pMyThis = nullptr;
- m_pUserPtr = p->m_pUserPtr;
-
- // identificator is the same (by défaut)
- if (m_ident == 0 ) m_ident = p->m_ident;
-
- m_defnum = p->m_defnum;
+ CBotVarNumber::Copy(pSrc, bName);
+ CBotVarInt* p = static_cast<CBotVarInt*>(pSrc);
+ m_defnum = p->m_defnum;
}
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::SetValInt(int val, const std::string& defnum)
{
- m_val = val;
- m_binit = CBotVar::InitType::DEF;
+ CBotVarNumber::SetValInt(val, defnum);
m_defnum = defnum;
}
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::SetValFloat(float val)
-{
- m_val = static_cast<int>(val);
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int CBotVarInt::GetValInt()
-{
- return m_val;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float CBotVarInt::GetValFloat()
-{
- return static_cast<float>(m_val);
-}
-
-////////////////////////////////////////////////////////////////////////////////
std::string CBotVarInt::GetValString()
{
- if ( !m_defnum.empty() ) return m_defnum;
-
- std::string res;
-
- if ( m_binit == CBotVar::InitType::UNDEF )
- {
- return LoadString(TX_UNDEF);
- }
-
- if ( m_binit == CBotVar::InitType::IS_NAN )
- {
- return LoadString(TX_NAN);
- }
-
- char buffer[300];
- sprintf(buffer, "%d", m_val);
- res = buffer;
-
- return res;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Mul(CBotVar* left, CBotVar* right)
-{
- m_val = left->GetValInt() * right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ if (!m_defnum.empty()) return m_defnum;
+ return CBotVarValue::GetValString();
}
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Power(CBotVar* left, CBotVar* right)
-{
- m_val = static_cast<int>( pow( static_cast<double>(left->GetValInt()) , static_cast<double>(right->GetValInt()) ));
- m_binit = CBotVar::InitType::DEF;
-}
-////////////////////////////////////////////////////////////////////////////////
-CBotError CBotVarInt::Div(CBotVar* left, CBotVar* right)
-{
- int r = right->GetValInt();
- if ( r != 0 )
- {
- m_val = left->GetValInt() / r;
- m_binit = CBotVar::InitType::DEF;
- }
- return ( r == 0 ? CBotErrZeroDiv : CBotNoErr );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-CBotError CBotVarInt::Modulo(CBotVar* left, CBotVar* right)
+void CBotVarInt::Neg()
{
- int r = right->GetValInt();
- if ( r != 0 )
- {
- m_val = left->GetValInt() % r;
- m_binit = CBotVar::InitType::DEF;
- }
- return ( r == 0 ? CBotErrZeroDiv : CBotNoErr );
+ CBotVarNumber::Neg();
+ m_defnum.empty();
}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Add(CBotVar* left, CBotVar* right)
+void CBotVarInt::Inc()
{
- m_val = left->GetValInt() + right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ CBotVarNumber::Inc();
+ m_defnum.empty();
}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Sub(CBotVar* left, CBotVar* right)
+void CBotVarInt::Dec()
{
- m_val = left->GetValInt() - right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ CBotVarNumber::Dec();
+ m_defnum.empty();
}
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::XOr(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() ^ right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() ^ right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::And(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() & right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() & right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::Or(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() | right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() | right->GetValInt());
}
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::SL(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() << right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() << right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::ASR(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValInt() >> right->GetValInt();
- m_binit = CBotVar::InitType::DEF;
+ SetValInt(left->GetValInt() >> right->GetValInt());
}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::SR(CBotVar* left, CBotVar* right)
{
- int source = left->GetValInt();
+ int source = left->GetValInt();
int shift = right->GetValInt();
- if (shift>=1) source &= 0x7fffffff;
- m_val = source >> shift;
- m_binit = CBotVar::InitType::DEF;
+ if (shift >= 1) source &= 0x7fffffff;
+ SetValInt(source >> shift);
}
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Neg()
-{
- m_val = -m_val;
-}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarInt::Not()
{
m_val = ~m_val;
}
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Inc()
-{
- m_val++;
- m_defnum.empty();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarInt::Dec()
-{
- m_val--;
- m_defnum.empty();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarInt::Lo(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() < right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarInt::Hi(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() > right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarInt::Ls(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() <= right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarInt::Hs(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() >= right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarInt::Eq(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() == right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarInt::Ne(CBotVar* left, CBotVar* right)
-{
- return left->GetValInt() != right->GetValInt();
-}
-
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarInt::Save0State(FILE* pf)
{
- if ( !m_defnum.empty() )
+ if (!m_defnum.empty())
{
- if(!WriteWord(pf, 200 )) return false; // special marker
- if(!WriteString(pf, m_defnum)) return false; // name of the value
+ if(!WriteWord(pf, 200)) return false; // special marker
+ if(!WriteString(pf, m_defnum)) return false;
}
return CBotVar::Save0State(pf);
}
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarInt::Save1State(FILE* pf)
{
- return WriteWord(pf, m_val); // the value of the variable
+ return WriteWord(pf, m_val);
}
} // namespace CBot
diff --git a/src/CBot/CBotVar/CBotVarInt.h b/src/CBot/CBotVar/CBotVarInt.h
index 8d7d4f9..32d0af0 100644
--- a/src/CBot/CBotVar/CBotVarInt.h
+++ b/src/CBot/CBotVar/CBotVarInt.h
@@ -19,7 +19,7 @@
#pragma once
-#include "CBot/CBotVar/CBotVar.h"
+#include "CBot/CBotVar/CBotVarValue.h"
namespace CBot
{
@@ -27,35 +27,19 @@ namespace CBot
/**
* \brief CBotVar subclass for managing integer values (::CBotTypInt)
*/
-class CBotVarInt : public CBotVar
+class CBotVarInt : public CBotVarNumber<int, CBotTypInt>
{
public:
- /**
- * \brief Constructor. Do not call directly, use CBotVar::Create()
- */
- CBotVarInt(const CBotToken& name);
+ CBotVarInt(const CBotToken &name) : CBotVarNumber(name) {}
void SetValInt(int val, const std::string& s = "") override;
- void SetValFloat(float val) override;
- int GetValInt() override;
- float GetValFloat() override;
std::string GetValString() override;
void Copy(CBotVar* pSrc, bool bName = true) override;
- void Add(CBotVar* left, CBotVar* right) override;
- void Sub(CBotVar* left, CBotVar* right) override;
- void Mul(CBotVar* left, CBotVar* right) override;
- CBotError Div(CBotVar* left, CBotVar* right) override;
- CBotError Modulo(CBotVar* left, CBotVar* right) override;
- void Power(CBotVar* left, CBotVar* right) override;
-
- bool Lo(CBotVar* left, CBotVar* right) override;
- bool Hi(CBotVar* left, CBotVar* right) override;
- bool Ls(CBotVar* left, CBotVar* right) override;
- bool Hs(CBotVar* left, CBotVar* right) override;
- bool Eq(CBotVar* left, CBotVar* right) override;
- bool Ne(CBotVar* left, CBotVar* right) override;
+ void Neg() override;
+ void Inc() override;
+ void Dec() override;
void XOr(CBotVar* left, CBotVar* right) override;
void Or(CBotVar* left, CBotVar* right) override;
@@ -66,16 +50,10 @@ public:
void SR(CBotVar* left, CBotVar* right) override;
void ASR(CBotVar* left, CBotVar* right) override;
- void Neg() override;
- void Inc() override;
- void Dec() override;
-
bool Save0State(FILE* pf) override;
bool Save1State(FILE* pf) override;
-private:
- //! The value.
- int m_val;
+protected:
//! The name if given by DefineNum.
std::string m_defnum;
friend class CBotVar;
diff --git a/src/CBot/CBotVar/CBotVarString.cpp b/src/CBot/CBotVar/CBotVarString.cpp
index 653badf..a5f3bba 100644
--- a/src/CBot/CBotVar/CBotVarString.cpp
+++ b/src/CBot/CBotVar/CBotVarString.cpp
@@ -19,117 +19,27 @@
#include "CBot/CBotVar/CBotVarString.h"
-#include "CBot/CBotEnums.h"
-#include "CBot/CBotToken.h"
-#include "CBot/CBotUtils.h"
-
namespace CBot
{
-////////////////////////////////////////////////////////////////////////////////
-CBotVarString::CBotVarString(const CBotToken& name)
-{
- m_token = new CBotToken(name);
- m_next = nullptr;
- m_pMyThis = nullptr;
- m_pUserPtr = nullptr;
- m_InitExpr = nullptr;
- m_LimExpr = nullptr;
- m_type = CBotTypString;
- m_binit = InitType::UNDEF;
- m_bStatic = false;
- m_mPrivate = ProtectionLevel::Public;
-
- m_val.clear();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarString::Copy(CBotVar* pSrc, bool bName)
-{
- CBotVarString* p = static_cast<CBotVarString*>(pSrc);
-
- if (bName) *m_token = *p->m_token;
- m_type = p->m_type;
- m_val = p->m_val;
- m_binit = p->m_binit;
-//- m_bStatic = p->m_bStatic;
- m_next = nullptr;
- m_pMyThis = nullptr;//p->m_pMyThis;
- m_pUserPtr = p->m_pUserPtr;
-
- // keeps indentificator the same (by default)
- if (m_ident == 0 ) m_ident = p->m_ident;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CBotVarString::SetValString(const std::string& val)
-{
- m_val = val;
- m_binit = CBotVar::InitType::DEF;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string CBotVarString::GetValString()
-{
- if ( m_binit == CBotVar::InitType::UNDEF )
- {
- return LoadString(TX_UNDEF);
- }
- if ( m_binit == CBotVar::InitType::IS_NAN )
- {
- return LoadString(TX_NAN);
- }
-
- return m_val;
-}
-
-////////////////////////////////////////////////////////////////////////////////
void CBotVarString::Add(CBotVar* left, CBotVar* right)
{
- m_val = left->GetValString() + right->GetValString();
- m_binit = CBotVar::InitType::DEF;
+ SetValString(left->GetValString() + right->GetValString());
}
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarString::Eq(CBotVar* left, CBotVar* right)
{
- return (left->GetValString() == right->GetValString());
+ return left->GetValString() == right->GetValString();
}
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarString::Ne(CBotVar* left, CBotVar* right)
{
- return (left->GetValString() != right->GetValString());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarString::Lo(CBotVar* left, CBotVar* right)
-{
- return (left->GetValString() == right->GetValString());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarString::Hi(CBotVar* left, CBotVar* right)
-{
- return (left->GetValString() == right->GetValString());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarString::Ls(CBotVar* left, CBotVar* right)
-{
- return (left->GetValString() == right->GetValString());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CBotVarString::Hs(CBotVar* left, CBotVar* right)
-{
- return (left->GetValString() == right->GetValString());
+ return left->GetValString() != right->GetValString();
}
-////////////////////////////////////////////////////////////////////////////////
bool CBotVarString::Save1State(FILE* pf)
{
- return WriteString(pf, m_val); // the value of the variable
+ return WriteString(pf, m_val);
}
} // namespace CBot
diff --git a/src/CBot/CBotVar/CBotVarString.h b/src/CBot/CBotVar/CBotVarString.h
index 136294e..5ff29d1 100644
--- a/src/CBot/CBotVar/CBotVarString.h
+++ b/src/CBot/CBotVar/CBotVarString.h
@@ -19,7 +19,7 @@
#pragma once
-#include "CBot/CBotVar/CBotVar.h"
+#include "CBot/CBotVar/CBotVarValue.h"
namespace CBot
{
@@ -27,33 +27,55 @@ namespace CBot
/**
* \brief CBotVar subclass for managing string values (::CBotTypString)
*/
-class CBotVarString : public CBotVar
+class CBotVarString : public CBotVarValue<std::string, CBotTypString>
{
public:
- /**
- * \brief Constructor. Do not call directly, use CBotVar::Create()
- */
- CBotVarString(const CBotToken& name);
+ CBotVarString(const CBotToken &name) : CBotVarValue(name) {}
- void SetValString(const std::string& val) override;
- std::string GetValString() override;
+ void SetValInt(int val, const std::string& s = "") override
+ {
+ SetValString(ToString(val));
+ }
- void Copy(CBotVar* pSrc, bool bName = true) override;
+ void SetValFloat(float val) override
+ {
+ SetValString(ToString(val));
+ }
+
+ int GetValInt()
+ {
+ return FromString<int>(GetValString());
+ }
+
+ float GetValFloat()
+ {
+ return FromString<float>(GetValString());
+ }
void Add(CBotVar* left, CBotVar* right) override;
- bool Lo(CBotVar* left, CBotVar* right) override;
- bool Hi(CBotVar* left, CBotVar* right) override;
- bool Ls(CBotVar* left, CBotVar* right) override;
- bool Hs(CBotVar* left, CBotVar* right) override;
bool Eq(CBotVar* left, CBotVar* right) override;
bool Ne(CBotVar* left, CBotVar* right) override;
bool Save1State(FILE* pf) override;
private:
- //! The value.
- std::string m_val;
+ template<typename T>
+ static std::string ToString(T val)
+ {
+ std::ostringstream ss;
+ ss << val;
+ return ss.str();
+ }
+
+ template<typename T>
+ static T FromString(std::string val)
+ {
+ std::istringstream ss(val);
+ T v;
+ ss >> v;
+ return v;
+ }
};
} // namespace CBot
diff --git a/src/CBot/CBotVar/CBotVarValue.h b/src/CBot/CBotVar/CBotVarValue.h
new file mode 100644
index 0000000..3e184d7
--- /dev/null
+++ b/src/CBot/CBotVar/CBotVarValue.h
@@ -0,0 +1,177 @@
+#pragma once
+
+#include "CBot/CBotVar/CBotVar.h"
+
+#include "CBot/CBotEnums.h"
+#include "CBot/CBotToken.h"
+
+#include <sstream>
+#include <cmath>
+
+
+namespace CBot
+{
+
+/**
+ * \brief A variable holding a simple value (bool, int, float, string)
+ */
+template <typename T, CBotType type>
+class CBotVarValue : public CBotVar
+{
+public:
+ /**
+ * \brief Constructor. Do not call directly, use CBotVar::Create()
+ */
+ CBotVarValue(const CBotToken& name) : CBotVar(name)
+ {
+ m_type = type;
+ }
+
+ void Copy(CBotVar* pSrc, bool bName = true) override
+ {
+ CBotVar::Copy(pSrc, bName);
+
+ CBotVarValue* p = static_cast<CBotVarValue*>(pSrc);
+ m_val = p->m_val;
+ }
+
+
+ void SetValString(const std::string& val) override
+ {
+ std::istringstream s(val);
+ s >> m_val;
+ m_binit = CBotVar::InitType::DEF;
+ }
+
+ std::string GetValString() override
+ {
+ if (m_binit == CBotVar::InitType::UNDEF)
+ return LoadString(TX_UNDEF);
+ if (m_binit == CBotVar::InitType::IS_NAN)
+ return LoadString(TX_NAN);
+
+ std::ostringstream s;
+ s << m_val;
+ return s.str();
+ }
+
+protected:
+ //! The value
+ T m_val;
+};
+
+/**
+ * \brief A number based variable (bool, int, float)
+ */
+template <typename T, CBotType type>
+class CBotVarNumberBase : public CBotVarValue<T, type>
+{
+public:
+ CBotVarNumberBase(const CBotToken &name) : CBotVarValue<T, type>(name) {}
+
+ void SetValInt(int val, const std::string &s = "") override
+ {
+ this->m_val = static_cast<T>(val);
+ this->m_binit = CBotVar::InitType::DEF;
+ }
+
+ void SetValFloat(float val) override
+ {
+ this->m_val = static_cast<T>(val);
+ this->m_binit = CBotVar::InitType::DEF;
+ }
+
+ int GetValInt() override
+ {
+ return static_cast<int>(this->m_val);
+ }
+
+ float GetValFloat() override
+ {
+ return static_cast<float>(this->m_val);
+ }
+
+
+ bool Eq(CBotVar* left, CBotVar* right) override
+ {
+ return left->GetValFloat() == right->GetValFloat();
+ }
+ bool Ne(CBotVar* left, CBotVar* right) override
+ {
+ return left->GetValFloat() != right->GetValFloat();
+ }
+};
+
+/**
+ * \brief A number variable (int, float)
+ */
+template <typename T, CBotType type>
+class CBotVarNumber : public CBotVarNumberBase<T, type>
+{
+public:
+ CBotVarNumber(const CBotToken &name) : CBotVarNumberBase<T, type>(name) {}
+
+ void Mul(CBotVar* left, CBotVar* right) override
+ {
+ this->SetValFloat(left->GetValFloat() * right->GetValFloat());
+ }
+ void Power(CBotVar* left, CBotVar* right) override
+ {
+ this->SetValFloat(pow(left->GetValFloat(), right->GetValFloat()));
+ }
+ CBotError Div(CBotVar* left, CBotVar* right) override
+ {
+ float r = right->GetValFloat();
+ if (r == 0) return CBotErrZeroDiv;
+ this->SetValFloat(left->GetValFloat() / r);
+ return CBotNoErr;
+ }
+ CBotError Modulo(CBotVar* left, CBotVar* right) override
+ {
+ float r = right->GetValFloat();
+ if (r == 0) return CBotErrZeroDiv;
+ this->SetValFloat(fmod(left->GetValFloat(), r));
+ return CBotNoErr;
+ }
+ void Add(CBotVar* left, CBotVar* right) override
+ {
+ this->SetValFloat(left->GetValFloat() + right->GetValFloat());
+ }
+ void Sub(CBotVar* left, CBotVar* right) override
+ {
+ this->SetValFloat(left->GetValFloat() - right->GetValFloat());
+ }
+
+ void Neg() override
+ {
+ this->m_val = - this->m_val;
+ }
+ void Inc() override
+ {
+ this->m_val++;
+ }
+ void Dec() override
+ {
+ this->m_val--;
+ }
+
+ bool Lo(CBotVar* left, CBotVar* right) override
+ {
+ return left->GetValFloat() < right->GetValFloat();
+ }
+ bool Hi(CBotVar* left, CBotVar* right) override
+ {
+ return left->GetValFloat() > right->GetValFloat();
+ }
+ bool Ls(CBotVar* left, CBotVar* right) override
+ {
+ return left->GetValFloat() <= right->GetValFloat();
+ }
+ bool Hs(CBotVar* left, CBotVar* right) override
+ {
+ return left->GetValFloat() >= right->GetValFloat();
+ }
+};
+
+}
+
diff --git a/src/CBot/CMakeLists.txt b/src/CBot/CMakeLists.txt
index dbd3d02..b77d0bb 100644
--- a/src/CBot/CMakeLists.txt
+++ b/src/CBot/CMakeLists.txt
@@ -122,6 +122,7 @@ set(SOURCES
CBotUtils.h
CBotVar/CBotVar.cpp
CBotVar/CBotVar.h
+ CBotVar/CBotVarValue.h
CBotVar/CBotVarArray.cpp
CBotVar/CBotVarArray.h
CBotVar/CBotVarBoolean.cpp
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git
More information about the Pkg-games-commits
mailing list