Commit c8cf6908 authored by Pavel Vainerman's avatar Pavel Vainerman

(codegen): добавил новую функцию idval(..) для получения ObjectId

по указателю или ссылке на in(out)_переменную..
parent 2308b7da
...@@ -335,12 +335,37 @@ ...@@ -335,12 +335,37 @@
* \return nullptr если элемент не найден * \return nullptr если элемент не найден
*/ */
long* valptr( UniSetTypes::ObjectId id ); long* valptr( UniSetTypes::ObjectId id );
/*! Получить id по переменной храняющей значение
* \return DefaultObjectId элемент не найден или если нет привязки
*/
UniSetTypes::ObjectId idval( long* vptr ); // работа по указателю
UniSetTypes::ObjectId idval( long& vptr ); // работа по ссылке..
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="COMMON-HEAD-PRIVATE"> <xsl:template name="COMMON-HEAD-PRIVATE">
<xsl:if test="normalize-space($VARMAP)='1'"> <xsl:if test="normalize-space($VARMAP)='1'">
class PtrMapHashFn
{
public:
size_t operator() (long* const&amp; key) const
{
return std::hash&lt;long*&gt;()(key);
}
};
class PtrMapEqualFn
{
public:
bool operator() (long* const&amp; i1, long* const&amp; i2) const
{
return (i1 == i2);
}
};
std::unordered_map&lt;UniSetTypes::ObjectId,long*&gt; vmap; std::unordered_map&lt;UniSetTypes::ObjectId,long*&gt; vmap;
std::unordered_map&lt;long*,const UniSetTypes::ObjectId*,PtrMapHashFn,PtrMapEqualFn&gt; ptrmap;
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
...@@ -485,6 +510,24 @@ long* <xsl:value-of select="$CLASSNAME"/>_SK::valptr( UniSetTypes::ObjectId id ) ...@@ -485,6 +510,24 @@ long* <xsl:value-of select="$CLASSNAME"/>_SK::valptr( UniSetTypes::ObjectId id )
return nullptr; return nullptr;
} }
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long* p )
{
auto i = ptrmap.find(p);
if( i!= ptrmap.end() )
return *(i->second);
return UniSetTypes::DefaultObjectId;
}
UniSetTypes::ObjectId <xsl:value-of select="$CLASSNAME"/>_SK::idval( long&amp; p )
{
auto i = ptrmap.find(&amp;p);
if( i!= ptrmap.end() )
return *(i->second);
return UniSetTypes::DefaultObjectId;
}
</xsl:if> </xsl:if>
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::sigterm( int signo ) void <xsl:value-of select="$CLASSNAME"/>_SK::sigterm( int signo )
...@@ -812,6 +855,7 @@ end_private(false) ...@@ -812,6 +855,7 @@ end_private(false)
<xsl:if test="normalize-space($VARMAP)='1'"> <xsl:if test="normalize-space($VARMAP)='1'">
vmap.emplace(<xsl:value-of select="normalize-space(@name)"/>,&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>); vmap.emplace(<xsl:value-of select="normalize-space(@name)"/>,&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>);
ptrmap.emplace(&amp;<xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>,&amp;<xsl:value-of select="normalize-space(@name)"/>);
</xsl:if> </xsl:if>
</xsl:for-each> </xsl:for-each>
......
...@@ -12,10 +12,14 @@ TestGen::TestGen( UniSetTypes::ObjectId id, xmlNode* confnode ): ...@@ -12,10 +12,14 @@ TestGen::TestGen( UniSetTypes::ObjectId id, xmlNode* confnode ):
long* i = valptr(input2_s); long* i = valptr(input2_s);
ObjectId d = idval(in_input2_s);
ObjectId d2 = idval(&in_input2_s);
ObjectId d3 = idval(i);
if( !i ) if( !i )
cerr << "input2_s NOT FOUND!!!" << endl; cerr << "input2_s NOT FOUND!!!" << endl;
else else
cerr << "input2_s=" << (*i) << endl; cerr << "input2_s=" << (*i) << " d=" << d << " d2=" << d2 << " d3=" << d3 << " input2_s=" << input2_s << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TestGen::~TestGen() TestGen::~TestGen()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment