added: to FunInfo<>:
bool remove_fun_data fun_data is removed only when remove_fun_data is true (default) git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@392 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
8e85a398d6
commit
4fc842ad91
|
@ -107,10 +107,10 @@ struct FunInfo
|
||||||
// can be null
|
// can be null
|
||||||
FunData * fun_data;
|
FunData * fun_data;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FunData * last_fun_data;
|
FunData * last_fun_data;
|
||||||
|
|
||||||
|
bool remove_fun_data;
|
||||||
|
|
||||||
|
|
||||||
// this is set by Generator
|
// this is set by Generator
|
||||||
// it indicates the number of a current iteration for the [for] statement (the first iteration is 0)
|
// it indicates the number of a current iteration for the [for] statement (the first iteration is 0)
|
||||||
|
@ -150,6 +150,7 @@ struct FunInfo
|
||||||
iter = 0;
|
iter = 0;
|
||||||
last_iter = 0;
|
last_iter = 0;
|
||||||
case_sensitive = true;
|
case_sensitive = true;
|
||||||
|
remove_fun_data = true;
|
||||||
fun_data = 0;
|
fun_data = 0;
|
||||||
last_fun_data = 0;
|
last_fun_data = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,11 +149,13 @@ private:
|
||||||
{
|
{
|
||||||
size_t iter;
|
size_t iter;
|
||||||
FunData * fun_data;
|
FunData * fun_data;
|
||||||
|
bool remove;
|
||||||
|
|
||||||
StackItem()
|
StackItem()
|
||||||
{
|
{
|
||||||
iter = 0;
|
iter = 0;
|
||||||
fun_data = 0;
|
fun_data = 0;
|
||||||
|
remove = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -165,6 +167,7 @@ private:
|
||||||
void ClearFilterTab();
|
void ClearFilterTab();
|
||||||
void ClearForStack();
|
void ClearForStack();
|
||||||
void ClearStream(StreamType & str);
|
void ClearStream(StreamType & str);
|
||||||
|
void RemoveStackFunData(StackItem & sitem);
|
||||||
|
|
||||||
template<class CharType>
|
template<class CharType>
|
||||||
CharType ToLower(CharType c);
|
CharType ToLower(CharType c);
|
||||||
|
@ -177,6 +180,7 @@ private:
|
||||||
|
|
||||||
bool Find(const Item::Function & item_fun, typename Functions<StreamType>::Function ** function);
|
bool Find(const Item::Function & item_fun, typename Functions<StreamType>::Function ** function);
|
||||||
|
|
||||||
|
void PrepareInfo(FunInfo<StreamType> & info);
|
||||||
void Call(typename Functions<StreamType>::Function * function, FunInfo<StreamType> & info);
|
void Call(typename Functions<StreamType>::Function * function, FunInfo<StreamType> & info);
|
||||||
void Call(typename Functions<StreamType>::Function * function, std::vector<std::wstring> & params,
|
void Call(typename Functions<StreamType>::Function * function, std::vector<std::wstring> & params,
|
||||||
StreamType & out_stream, bool clear_out_stream, const StreamType & in_stream);
|
StreamType & out_stream, bool clear_out_stream, const StreamType & in_stream);
|
||||||
|
@ -268,12 +272,15 @@ Generator<StreamType> & Generator<StreamType>::operator=(const Generator<StreamT
|
||||||
trim_white = n.trim_white;
|
trim_white = n.trim_white;
|
||||||
skip_new_line = n.skip_new_line;
|
skip_new_line = n.skip_new_line;
|
||||||
|
|
||||||
|
// !! IMROVE ME
|
||||||
|
// does we really need to clear those two stacks?
|
||||||
// don't copy filter tab
|
// don't copy filter tab
|
||||||
ClearFilterTab();
|
ClearFilterTab();
|
||||||
|
|
||||||
// don't copy [for] stack
|
// don't copy [for] stack
|
||||||
ClearForStack();
|
ClearForStack();
|
||||||
|
|
||||||
|
// !! CHECK ME
|
||||||
|
// may copying should be denied when generator is working?
|
||||||
// don't copy 'is_generator_working' flag
|
// don't copy 'is_generator_working' flag
|
||||||
is_generator_working = false;
|
is_generator_working = false;
|
||||||
|
|
||||||
|
@ -325,7 +332,7 @@ template<class StreamType>
|
||||||
void Generator<StreamType>::ClearForStack()
|
void Generator<StreamType>::ClearForStack()
|
||||||
{
|
{
|
||||||
for(size_t i=0 ; i<stack_tab.size() ; ++i)
|
for(size_t i=0 ; i<stack_tab.size() ; ++i)
|
||||||
delete stack_tab[i].fun_data;
|
RemoveStackFunData(stack_tab[i]);
|
||||||
|
|
||||||
stack_tab.clear();
|
stack_tab.clear();
|
||||||
}
|
}
|
||||||
|
@ -342,6 +349,18 @@ void Generator<StreamType>::ClearStream(StreamType & str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class StreamType>
|
||||||
|
void Generator<StreamType>::RemoveStackFunData(StackItem & sitem)
|
||||||
|
{
|
||||||
|
if( sitem.fun_data && sitem.remove )
|
||||||
|
{
|
||||||
|
delete sitem.fun_data;
|
||||||
|
sitem.fun_data = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
template<class CharType>
|
template<class CharType>
|
||||||
CharType Generator<StreamType>::ToLower(CharType c)
|
CharType Generator<StreamType>::ToLower(CharType c)
|
||||||
|
@ -509,10 +528,8 @@ return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
void Generator<StreamType>::Call(typename Functions<StreamType>::Function * function, FunInfo<StreamType> & info)
|
void Generator<StreamType>::PrepareInfo(FunInfo<StreamType> & info)
|
||||||
{
|
{
|
||||||
info.Clear();
|
info.Clear();
|
||||||
|
|
||||||
|
@ -537,10 +554,20 @@ void Generator<StreamType>::Call(typename Functions<StreamType>::Function * func
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !stack_tab.empty() )
|
if( !stack_tab.empty() )
|
||||||
info.fun_data = stack_tab.back().fun_data;
|
{
|
||||||
|
info.fun_data = stack_tab.back().fun_data;
|
||||||
|
info.remove_fun_data = stack_tab.back().remove;
|
||||||
|
}
|
||||||
|
|
||||||
if( stack_tab.size() >= 2 )
|
if( stack_tab.size() >= 2 )
|
||||||
info.last_fun_data = stack_tab[stack_tab.size()-2].fun_data;
|
info.last_fun_data = stack_tab[stack_tab.size()-2].fun_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class StreamType>
|
||||||
|
void Generator<StreamType>::Call(typename Functions<StreamType>::Function * function, FunInfo<StreamType> & info)
|
||||||
|
{
|
||||||
|
PrepareInfo(info);
|
||||||
|
|
||||||
if( function->type == Functions<StreamType>::function )
|
if( function->type == Functions<StreamType>::function )
|
||||||
{
|
{
|
||||||
|
@ -552,20 +579,20 @@ void Generator<StreamType>::Call(typename Functions<StreamType>::Function * func
|
||||||
info.res = !function->variable.empty();
|
info.res = !function->variable.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( info.fun_data )
|
if( !stack_tab.empty() )
|
||||||
{
|
{
|
||||||
if( !stack_tab.empty() )
|
if( stack_tab.back().fun_data != info.fun_data )
|
||||||
{
|
{
|
||||||
if( stack_tab.back().fun_data != info.fun_data )
|
RemoveStackFunData(stack_tab.back());
|
||||||
{
|
stack_tab.back().fun_data = info.fun_data;
|
||||||
delete stack_tab.back().fun_data;
|
|
||||||
stack_tab.back().fun_data = info.fun_data;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
stack_tab.back().remove = info.remove_fun_data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( info.remove_fun_data )
|
||||||
delete info.fun_data;
|
delete info.fun_data;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
last_res = info.res;
|
last_res = info.res;
|
||||||
|
@ -1155,10 +1182,8 @@ void Generator<StreamType>::MakeTextFor(Item & item)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
stack_tab.push_back(StackItem());
|
stack_tab.push_back(StackItem());
|
||||||
|
|
||||||
MakeTextForLoop(item, function);
|
MakeTextForLoop(item, function);
|
||||||
|
RemoveStackFunData(stack_tab.back());
|
||||||
delete stack_tab.back().fun_data;
|
|
||||||
stack_tab.erase(--stack_tab.end());
|
stack_tab.erase(--stack_tab.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue