00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "cgenfunct.h"
00025
00026 namespace faudes {
00027
00028
00029 bool cIsControllable(
00030 const cGenerator& rPlantGen,
00031 const vGenerator& rSupCandGen)
00032 {
00033 return IsControllable(rPlantGen, rPlantGen.ControllableEvents(), rSupCandGen);
00034 }
00035
00036
00037
00038
00039 void cSupConNB(
00040 const cGenerator& rPlantGen,
00041 const vGenerator& rSpecGen,
00042 cGenerator& rResGen) {
00043
00044
00045 cGenerator* pResGen = &rResGen;
00046 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
00047 pResGen= rResGen.NewP();
00048 }
00049
00050
00051 SupConNB(rPlantGen, rPlantGen.ControllableEvents(),rSpecGen,*pResGen);
00052
00053
00054 pResGen->SetControllable(rPlantGen.ControllableEvents());
00055
00056
00057 if(pResGen != &rResGen) {
00058 rResGen = *pResGen;
00059 delete pResGen;
00060 }
00061
00062 }
00063
00064
00065
00066 void cSupCon(
00067 const cGenerator& rPlantGen,
00068 const vGenerator& rSpecGen,
00069 cGenerator& rResGen) {
00070
00071
00072 cGenerator* pResGen = &rResGen;
00073 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
00074 pResGen= rResGen.NewP();
00075 }
00076
00077
00078 SupCon(rPlantGen, rPlantGen.ControllableEvents(),rSpecGen,*pResGen);
00079
00080
00081 pResGen->SetControllable(rPlantGen.ControllableEvents());
00082
00083
00084 if(pResGen != &rResGen) {
00085 rResGen = *pResGen;
00086 delete pResGen;
00087 }
00088
00089 }
00090
00091
00092
00093 void cParallel(
00094 const cGenerator& rGen1,
00095 const cGenerator& rGen2,
00096 cGenerator& rResGen)
00097 {
00098
00099
00100 #ifdef FAUDES_CHECKED
00101 EventSet inconsistent =
00102 (rGen1.ControllableEvents()*rGen2.UncontrollableEvents())
00103 +(rGen1.UncontrollableEvents()*rGen2.ControllableEvents());
00104
00105 if(!inconsistent.Empty()) {
00106 std::stringstream errstr;
00107 errstr << "cParallel: inconsistent controllability flags";
00108
00109 }
00110 #endif
00111
00112
00113 cGenerator* pResGen = &rResGen;
00114 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
00115 pResGen= rResGen.NewP();
00116 }
00117
00118
00119 Parallel(rGen1,rGen2,*pResGen);
00120
00121
00122 pResGen->SetControllable(rGen1.ControllableEvents());
00123 pResGen->SetControllable(rGen2.ControllableEvents());
00124
00125
00126 if(pResGen != &rResGen) {
00127 rResGen = *pResGen;
00128 delete pResGen;
00129 }
00130 }
00131
00132
00133
00134 void cProject(
00135 const cGenerator& rGen,
00136 const EventSet& rProjectAlphabet,
00137 cGenerator& rResGen)
00138 {
00139
00140
00141 cGenerator* pResGen = &rResGen;
00142 if(&rResGen== &rGen) {
00143 pResGen= rResGen.NewP();
00144 }
00145
00146
00147 Project(rGen,rProjectAlphabet,*pResGen);
00148
00149
00150 pResGen->SetControllable(rGen.ControllableEvents()*rProjectAlphabet);
00151
00152
00153 if(pResGen != &rResGen) {
00154 rResGen = *pResGen;
00155 delete pResGen;
00156 }
00157 }
00158
00159
00160
00161 }