From 2578bd1069491beea228f7cf809a8790d9467ad1 Mon Sep 17 00:00:00 2001 From: rylek Date: Tue, 4 May 2010 07:32:02 +0000 Subject: [PATCH] +TCore: MDECLA variants added to expression evaluator git-svn-id: svn://ultimatepp.org/upp/trunk@2362 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/TCore/CalcBasic.cpp | 1 + uppsrc/TCore/CalcNode.h | 72 +++++++++++++++++++++++++++++--------- uppsrc/TCore/TCore.t | 4 +-- uppsrc/TCore/database.h | 4 +-- 4 files changed, 61 insertions(+), 20 deletions(-) diff --git a/uppsrc/TCore/CalcBasic.cpp b/uppsrc/TCore/CalcBasic.cpp index 056b165fa..c724377dc 100644 --- a/uppsrc/TCore/CalcBasic.cpp +++ b/uppsrc/TCore/CalcBasic.cpp @@ -1072,6 +1072,7 @@ static bool CwithVSRC(CalcPacket& packet) packet.args.Add(CalcType::Describe()); packet.args.Add("..."); packet.args.Add(CalcType::Describe()); + packet.result = CalcType::Describe(); return true; } int nargs = packet.args.GetCount(); diff --git a/uppsrc/TCore/CalcNode.h b/uppsrc/TCore/CalcNode.h index 340bce639..e082616c7 100644 --- a/uppsrc/TCore/CalcNode.h +++ b/uppsrc/TCore/CalcNode.h @@ -508,8 +508,7 @@ inline bool CalcCastPacket(CalcPacket& packet, R (*fn)(CalcPacket& packet), BTA template 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::Describe(); return true; } @@ -519,6 +518,19 @@ inline bool CalcCastMember(CalcPacket& packet, O *clss, R (M::*fn)(), BTA * = 0) return true; } +template +inline bool CalcCastMemberPacket(CalcPacket& packet, O *clss, R (M::*fn)(), BTA * = 0) +{ + if(packet.help) { // generate help info + packet.result = CalcType::Describe(); + return true; + } + if(packet.args.GetCount() != 0) + return false; + packet.result = CalcType::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 \ -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::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::ToValue((clss ->* fn)( \ + packet.result = CalcType::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(packet, this, &BASECLASS::call); } }; \ +static GLOBAL_VARP(HelpCalc, FGENID(chlp, dflt), (callback(static_cast(0), \ + brutal_cast(&FGENID(clcp, dflt)::CalcIt)), \ + id, "Calc$" topic, group)); \ +INITBLOCK_(FGENID(mblk, tag)) { \ + FGENID(chlp, dflt)(); \ + static CalcLocalItem FGENID(clci, dflt)(BASECLASS::GetLocalMap(), id, \ + brutal_cast(&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 diff --git a/uppsrc/TCore/TCore.t b/uppsrc/TCore/TCore.t index 5ec45c5b8..f00b4e828 100644 --- a/uppsrc/TCore/TCore.t +++ b/uppsrc/TCore/TCore.t @@ -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 diff --git a/uppsrc/TCore/database.h b/uppsrc/TCore/database.h index 29be03180..4b1be1660 100644 --- a/uppsrc/TCore/database.h +++ b/uppsrc/TCore/database.h @@ -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