mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
+TCore: MDECLA variants added to expression evaluator
git-svn-id: svn://ultimatepp.org/upp/trunk@2362 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
b5dc3801e1
commit
2578bd1069
4 changed files with 61 additions and 20 deletions
|
|
@ -1072,6 +1072,7 @@ static bool CwithVSRC(CalcPacket& packet)
|
|||
packet.args.Add(CalcType<String>::Describe());
|
||||
packet.args.Add("...");
|
||||
packet.args.Add(CalcType<const CalcNode *>::Describe());
|
||||
packet.result = CalcType<Value>::Describe();
|
||||
return true;
|
||||
}
|
||||
int nargs = packet.args.GetCount();
|
||||
|
|
|
|||
|
|
@ -508,8 +508,7 @@ inline bool CalcCastPacket(CalcPacket& packet, R (*fn)(CalcPacket& packet), BTA
|
|||
template <class BTA, class O, class M, class R>
|
||||
inline bool CalcCastMember(CalcPacket& packet, O *clss, R (M::*fn)(), BTA * = 0)
|
||||
{
|
||||
if(packet.help)
|
||||
{ // generate help info
|
||||
if(packet.help) { // generate help info
|
||||
packet.result = CalcType<R>::Describe();
|
||||
return true;
|
||||
}
|
||||
|
|
@ -519,6 +518,19 @@ inline bool CalcCastMember(CalcPacket& packet, O *clss, R (M::*fn)(), BTA * = 0)
|
|||
return true;
|
||||
}
|
||||
|
||||
template <class BTA, class O, class M, class R>
|
||||
inline bool CalcCastMemberPacket(CalcPacket& packet, O *clss, R (M::*fn)(), BTA * = 0)
|
||||
{
|
||||
if(packet.help) { // generate help info
|
||||
packet.result = CalcType<R>::Describe();
|
||||
return true;
|
||||
}
|
||||
if(packet.args.GetCount() != 0)
|
||||
return false;
|
||||
packet.result = CalcType<R>::ToValue((clss ->* fn)(packet));
|
||||
return true;
|
||||
}
|
||||
|
||||
struct BTA0 { enum { NIL = 0 }; };
|
||||
struct BTA1 { enum { NIL = 1 }; };
|
||||
|
||||
|
|
@ -556,12 +568,11 @@ inline bool NM(CalcPacket& packet, R (*fn)(CP_ARG_PREFIX __List##I(E__Arg)), BTA
|
|||
return true; \
|
||||
}
|
||||
|
||||
#define CalcCastMemberTemplate(I) \
|
||||
#define CalcCastMemberTemplate(NM, I) \
|
||||
template <class BTA, class O, class M, class R, __List##I(E__Class)> \
|
||||
inline bool CalcCastMember(CalcPacket& packet, O *clss, R (M::*fn)(__List##I(E__Arg)), BTA * = 0) \
|
||||
inline bool NM(CalcPacket& packet, O *clss, R (M::*fn)(CP_ARG_PREFIX __List##I(E__Arg)), BTA * = 0) \
|
||||
{ \
|
||||
if(packet.help) \
|
||||
{ \
|
||||
if(packet.help) { \
|
||||
packet.result = CalcType<R>::Describe(); \
|
||||
__List##I(E__Descr); \
|
||||
return true; \
|
||||
|
|
@ -570,45 +581,55 @@ inline bool CalcCastMember(CalcPacket& packet, O *clss, R (M::*fn)(__List##I(E__
|
|||
return false; \
|
||||
bool null = false; \
|
||||
__Expand##I(E__ChkArg) \
|
||||
if(BTA::NIL && null) \
|
||||
{ \
|
||||
if(BTA::NIL && null) { \
|
||||
packet.result = Value(); \
|
||||
return true; \
|
||||
} \
|
||||
packet.result = CalcType<R>::ToValue((clss ->* fn)( \
|
||||
packet.result = CalcType<R>::ToValue((clss ->* fn)(CP_PREFIX \
|
||||
__List##I(E__CvArg))); \
|
||||
return true; \
|
||||
} \
|
||||
|
||||
#define CP_ARG_PREFIX
|
||||
#define CP_PREFIX
|
||||
|
||||
CalcCastTemplate(CalcCast, 1)
|
||||
CalcCastTemplate(CalcCast, 2)
|
||||
CalcCastTemplate(CalcCast, 3)
|
||||
CalcCastTemplate(CalcCast, 4)
|
||||
CalcCastTemplate(CalcCast, 5)
|
||||
CalcCastTemplate(CalcCast, 6)
|
||||
|
||||
CalcCastMemberTemplate(CalcCastMember, 1)
|
||||
CalcCastMemberTemplate(CalcCastMember, 2)
|
||||
CalcCastMemberTemplate(CalcCastMember, 3)
|
||||
CalcCastMemberTemplate(CalcCastMember, 4)
|
||||
CalcCastMemberTemplate(CalcCastMember, 5)
|
||||
CalcCastMemberTemplate(CalcCastMember, 6)
|
||||
|
||||
#undef CP_ARG_PREFIX
|
||||
#undef CP_PREFIX
|
||||
|
||||
#define CP_ARG_PREFIX CalcPacket& packet,
|
||||
#define CP_PREFIX packet,
|
||||
|
||||
CalcCastTemplate(CalcCastPacket, 1)
|
||||
CalcCastTemplate(CalcCastPacket, 2)
|
||||
CalcCastTemplate(CalcCastPacket, 3)
|
||||
CalcCastTemplate(CalcCastPacket, 4)
|
||||
CalcCastTemplate(CalcCastPacket, 5)
|
||||
CalcCastTemplate(CalcCastPacket, 6)
|
||||
|
||||
CalcCastMemberTemplate(CalcCastMemberPacket, 1)
|
||||
CalcCastMemberTemplate(CalcCastMemberPacket, 2)
|
||||
CalcCastMemberTemplate(CalcCastMemberPacket, 3)
|
||||
CalcCastMemberTemplate(CalcCastMemberPacket, 4)
|
||||
CalcCastMemberTemplate(CalcCastMemberPacket, 5)
|
||||
CalcCastMemberTemplate(CalcCastMemberPacket, 6)
|
||||
|
||||
#undef CP_ARG_PREFIX
|
||||
#undef CP_PREFIX
|
||||
|
||||
CalcCastMemberTemplate(1)
|
||||
CalcCastMemberTemplate(2)
|
||||
CalcCastMemberTemplate(3)
|
||||
CalcCastMemberTemplate(4)
|
||||
CalcCastMemberTemplate(5)
|
||||
CalcCastMemberTemplate(6)
|
||||
|
||||
#define FGENID2(tag, lnum) __##tag##lnum##__
|
||||
#define FGENID1(tag, lnum) FGENID2(tag, lnum)
|
||||
#define FGENID(a, b) COMBINE(COMBINE(a, b), __LINE__)
|
||||
|
|
@ -667,9 +688,28 @@ INITBLOCK_(FGENID(mblk, tag)) { \
|
|||
static void FGENID(chlt, dflt)(String& out) { out.Cat(FGENID(chlp, dflt)().GetTitle()); } \
|
||||
RegisterHelpTopicInfo("Calc$" topic, __FILE__, callback(&FGENID(chlt, dflt)), CNULL)
|
||||
|
||||
#define MDECLTA(null, topic, id, group, call) \
|
||||
struct FGENID(clcp, dflt) : public BASECLASS \
|
||||
{ FGENID(clcp, dflt)(); bool CalcIt(CalcPacket& packet) { return CalcCastMemberPacket<null>(packet, this, &BASECLASS::call); } }; \
|
||||
static GLOBAL_VARP(HelpCalc, FGENID(chlp, dflt), (callback(static_cast<BASECLASS *>(0), \
|
||||
brutal_cast<bool (BASECLASS::*)(CalcPacket&)>(&FGENID(clcp, dflt)::CalcIt)), \
|
||||
id, "Calc$" topic, group)); \
|
||||
INITBLOCK_(FGENID(mblk, tag)) { \
|
||||
FGENID(chlp, dflt)(); \
|
||||
static CalcLocalItem<BASECLASS> FGENID(clci, dflt)(BASECLASS::GetLocalMap(), id, \
|
||||
brutal_cast<bool (BASECLASS::*)(CalcPacket&)>(&FGENID(clcp, dflt)::CalcIt)); \
|
||||
} \
|
||||
static void FGENID(chlt, dflt)(String& out) { out.Cat(FGENID(chlp, dflt)().GetTitle()); } \
|
||||
RegisterHelpTopicInfo("Calc$" topic, __FILE__, callback(&FGENID(chlt, dflt)), CNULL)
|
||||
|
||||
#define MDECL(id, x, group) MDECLT(BTA0, ASSTRING(call), id, group, call)
|
||||
#define MDECL0(id, x, group) MDECLT(BTA1, ASSTRING(id), id, group, COMBINE3(C, id, x))
|
||||
#define MDECLP(id, x, group) MDECLT(BTA0, "C" ASSTRING(id) ASSTRING(x), ASSTRING(id), group, COMBINE3(C, id, x))
|
||||
#define MDECLP0(id, x, group) MDECLT(BTA1, "C" ASSTRING(id) ASSTRING(x), ASSTRING(id), group, COMBINE3(C, id, x))
|
||||
|
||||
#define MDECLA(id, x, group) MDECLTA(BTA0, ASSTRING(call), id, group, call)
|
||||
#define MDECLA0(id, x, group) MDECLTA(BTA1, ASSTRING(id), id, group, COMBINE3(C, id, x))
|
||||
#define MDECLAP(id, x, group) MDECLTA(BTA0, "C" ASSTRING(id) ASSTRING(x), ASSTRING(id), group, COMBINE3(C, id, x))
|
||||
#define MDECLAP0(id, x, group) MDECLTA(BTA1, "C" ASSTRING(id) ASSTRING(x), ASSTRING(id), group, COMBINE3(C, id, x))
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ csCZ("přetečení při výpočtu v reálných číslech")
|
|||
// CalcNode.cpp
|
||||
|
||||
T_("lambda-expression")
|
||||
csCZ("")
|
||||
csCZ("lambda-výraz")
|
||||
|
||||
T_("Expression evaluator")
|
||||
csCZ("Výrazový kalkulátor")
|
||||
|
|
@ -166,7 +166,7 @@ T_("constant or function expected, found: ")
|
|||
csCZ("očekávána konstanta nebo funkce, nalezeno: ")
|
||||
|
||||
T_("')' (subexpression starts at: %s)")
|
||||
csCZ("")
|
||||
csCZ("')' (začátek podvýrazu: %s)")
|
||||
|
||||
|
||||
// CalcBasic.cpp
|
||||
|
|
|
|||
|
|
@ -814,8 +814,8 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
inline dword ValueTypeNo(const byte*) { return DataTableColumn::BYTE_V; }
|
||||
inline dword ValueTypeNo(const short*) { return DataTableColumn::SHORT_V; }
|
||||
inline dword ValueTypeNo(const byte&) { return DataTableColumn::BYTE_V; }
|
||||
inline dword ValueTypeNo(const short&) { return DataTableColumn::SHORT_V; }
|
||||
//inline dword ValueTypeNo(const bool&) { return DataTableColumn::BOOL_V; }
|
||||
|
||||
class DataTable : public DataClient
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue