00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <mpcl/text/codegen/defs.hh>
00027 #include <mpcl/text/codegen/instruction_body.hh>
00028 #include <mpcl/text/regex/matcher.hh>
00029
00030
00031
00032
00033
00034
00035 mpcl::text::codegen::TInstructionBody& mpcl::text::codegen::TInstructionBody::
00036 operator = (const TInstructionBody& rktSOURCE_INSTRUCTION_BODY)
00037 {
00038
00039 tClauseMap = rktSOURCE_INSTRUCTION_BODY.tClauseMap;
00040 return *this;
00041
00042 }
00043
00044
00045 void mpcl::text::codegen::TInstructionBody::
00046 read (std::basic_istream<char_type, traits_type>& rtSOURCE_STREAM)
00047 {
00048
00049 using text::regex::TMatcher;
00050
00051 TMatcher tMatcher (rtSOURCE_STREAM);
00052
00053 tMatcher.setCaseSensitiveness (false);
00054
00055
00056
00057
00058 rtSOURCE_STREAM >> tClauseMap;
00059
00060
00061
00062
00063 while ( tMatcher.scan (pkcCommentTagPattern, NULL) );
00064 tMatcher.scan (pkcINSTRUCT_EndTagPattern, NULL);
00065
00066 }
00067
00068
00069
00070
00071
00072
00073 bool mpcl::text::codegen::TInstructionBody::
00074 existsClause (const char* pkcCLAUSE_NAME) const
00075 {
00076
00077 return ( tClauseMap.end() != tClauseMap.find (pkcCLAUSE_NAME) );
00078
00079 }
00080
00081
00082 const mpcl::text::codegen::TClauseTagString& mpcl::text::codegen::TInstructionBody::
00083 clauseTag (const char* pkcSOURCE_CLAUSE_TAG) const
00084 {
00085
00086 TClauseMap::const_iterator ktIter = tClauseMap.find (pkcSOURCE_CLAUSE_TAG);
00087
00088 if ( ktIter == tClauseMap.end() )
00089 {
00090 TString yMessage;
00091
00092 yMessage = Format ("clause '%s' not found", pkcSOURCE_CLAUSE_TAG);
00093 throw TNotFoundException (yMessage, __FILE__, __LINE__);
00094 }
00095 return ktIter->first;
00096
00097 }
00098
00099
00100 const mpcl::text::codegen::TClauseBodyString& mpcl::text::codegen::TInstructionBody::
00101 clauseBody (const char* pkcSOURCE_CLAUSE_TAG) const
00102 {
00103
00104 TClauseMap::const_iterator ktIter = tClauseMap.find (pkcSOURCE_CLAUSE_TAG);
00105
00106 if ( ktIter == tClauseMap.end() )
00107 {
00108 TString yMessage;
00109
00110 yMessage = Format ("clause '%s' not found", pkcSOURCE_CLAUSE_TAG);
00111 throw TNotFoundException (yMessage, __FILE__, __LINE__);
00112 }
00113 return ktIter->second;
00114
00115 }
00116
00117
00118 mpcl::util::collection::TMap<mpcl::text::TString, const mpcl::text::codegen::TClauseBodyString*> mpcl::text::codegen::TInstructionBody::
00119 targetedVariablesForClause (const char* pkcSOURCE_CLAUSE_TAG) const
00120 {
00121
00122 using util::collection::TMap;
00123
00124 TString yClauseName;
00125 TMap<TString, const TClauseBodyString*> tResultMap;
00126 size_t zSeparatorPosition;
00127 TClauseMap::const_iterator ktIter = tClauseMap.begin();
00128 TClauseMap::const_iterator ktEnd = tClauseMap.end();
00129
00130 for (; ( ktIter != ktEnd ) ;++ktIter)
00131 {
00132 const TClauseTagString& rkyCurrentClauseTag = ktIter->first;
00133
00134 yClauseName = rkyCurrentClauseTag;
00135 if ( TString::npos != (zSeparatorPosition = yClauseName.find (pkcTargetSeparator)) )
00136 {
00137 yClauseName.erase (zSeparatorPosition);
00138 }
00139 if ( yClauseName == pkcSOURCE_CLAUSE_TAG )
00140 {
00141 if ( rkyCurrentClauseTag.hasTarget() )
00142 {
00143 tResultMap.bind (rkyCurrentClauseTag.target(), &ktIter->second);
00144 }
00145 }
00146 }
00147 return tResultMap;
00148
00149 }
00150
00151
00152 const mpcl::text::codegen::TClauseBodyString& mpcl::text::codegen::TInstructionBody::
00153 operator [] (const char* pkcSOURCE_CLAUSE_TAG) const
00154 {
00155
00156 TClauseMap::const_iterator ktIter = tClauseMap.find (pkcSOURCE_CLAUSE_TAG);
00157
00158 if ( ktIter == tClauseMap.end() )
00159 {
00160 TString yMessage;
00161
00162 yMessage = Format ("clause '%s' not found", pkcSOURCE_CLAUSE_TAG);
00163 throw TNotFoundException (yMessage, __FILE__, __LINE__);
00164 }
00165 return ktIter->second;
00166
00167 }
00168
00169
00170 bool mpcl::text::codegen::TInstructionBody::
00171 operator == (const TInstructionBody& rktSOURCE_INSTRUCTION_BODY) const
00172 {
00173
00174 return ( tClauseMap == rktSOURCE_INSTRUCTION_BODY.tClauseMap );
00175
00176 }
00177
00178
00179 void mpcl::text::codegen::TInstructionBody::
00180 write (std::basic_ostream<char_type, traits_type>& rtTARGET_STREAM) const
00181 {
00182
00183 rtTARGET_STREAM << tClauseMap << "</instruct>\n";
00184
00185 }