]> Creatis software - bbtk.git/blob - packages/std/src/bbstdVectorFilterString.cxx
19953563937501163d5efc1e3a603583311855a5
[bbtk.git] / packages / std / src / bbstdVectorFilterString.cxx
1 //===== 
2 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
3 //===== 
4 #include "bbstdVectorFilterString.h"
5 #include "bbstdPackage.h"
6
7 #include <string>
8 #include <stdlib.h>
9 namespace bbstd
10 {
11
12 BBTK_ADD_BLACK_BOX_TO_PACKAGE(std,VectorFilterString)
13 BBTK_BLACK_BOX_IMPLEMENTATION(VectorFilterString,bbtk::AtomicBlackBox);
14 //===== 
15 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
16 //===== 
17
18 void VectorFilterString::CountConnectedRepetitions()
19 {
20     std::vector<std::string> vOut0;
21     std::vector<std::string> vOut1;
22     std::vector<std::string> vOut2;
23     std::vector<std::string> vOut3;
24     std::vector<std::string> vOut4;
25     std::vector<std::string> vOut5;
26     std::vector<std::string> vOut6;
27     std::vector<std::string> vOut7;
28     std::vector<std::string> vOut8;
29     std::vector<std::string> vOut9;
30     ConnectionRepetitions( bbGetInputIn0() , &vOut0 );
31     ConnectionRepetitions( bbGetInputIn1() , &vOut1 );
32     ConnectionRepetitions( bbGetInputIn2() , &vOut2 );
33     ConnectionRepetitions( bbGetInputIn3() , &vOut3 );
34     ConnectionRepetitions( bbGetInputIn4() , &vOut4 );
35     ConnectionRepetitions( bbGetInputIn5() , &vOut5 );
36     ConnectionRepetitions( bbGetInputIn6() , &vOut6 );
37     ConnectionRepetitions( bbGetInputIn7() , &vOut7 );
38     ConnectionRepetitions( bbGetInputIn8() , &vOut8 );
39     ConnectionRepetitions( bbGetInputIn9() , &vOut9 );
40     bbSetOutputOut0( vOut0 );
41     bbSetOutputOut1( vOut1 );
42     bbSetOutputOut2( vOut2 );
43     bbSetOutputOut3( vOut3 );
44     bbSetOutputOut4( vOut4 );
45     bbSetOutputOut5( vOut5 );
46     bbSetOutputOut6( vOut6 );
47     bbSetOutputOut7( vOut7 );
48     bbSetOutputOut8( vOut8 );
49     bbSetOutputOut9( vOut9 );
50 }
51
52 void VectorFilterString::ConnectionRepetitions( std::vector<std::string> vIn,std::vector<std::string> *vOut  )
53 {
54         int i,size=vIn.size();
55         int itmp=0, acum=0;
56         std::string stmp;
57         for( i=0;i<size;i++)
58         {
59                 if (vIn[i].compare( vIn[itmp])==0) 
60                 {
61                         acum++;
62                 } else {
63                         itmp = i;
64                         vOut->push_back(std::to_string(acum));
65                         acum = 1;
66                 }
67         } // for
68         vOut->push_back(std::to_string(acum));
69 }
70
71 void VectorFilterString::FilterByFindinIn0()
72 {
73         std::vector<std::string> vOut0;
74         std::vector<std::string> vOut1;
75         std::vector<std::string> vOut2;
76         std::vector<std::string> vOut3;
77         std::vector<std::string> vOut4;
78         std::vector<std::string> vOut5;
79         std::vector<std::string> vOut6;
80         std::vector<std::string> vOut7;
81         std::vector<std::string> vOut8;
82         std::vector<std::string> vOut9;
83
84         int i,size = bbGetInputIn0().size();
85         int pos;
86         for (i=0; i<size; i++)
87         {
88                 pos=bbGetInputIn0()[i].find( bbGetInputsk1());
89                 if (  pos  >= 0)
90                 {
91                         vOut0.push_back( bbGetInputIn0()[i] );
92                         if ( i < bbGetInputIn1().size() ) { vOut1.push_back( bbGetInputIn1()[i] ); }
93                         if ( i < bbGetInputIn2().size() ) { vOut2.push_back( bbGetInputIn2()[i] ); }
94                         if ( i < bbGetInputIn3().size() ) { vOut3.push_back( bbGetInputIn3()[i] ); }
95                         if ( i < bbGetInputIn4().size() ) { vOut4.push_back( bbGetInputIn4()[i] ); }
96                         if ( i < bbGetInputIn5().size() ) { vOut5.push_back( bbGetInputIn5()[i] ); }
97                         if ( i < bbGetInputIn6().size() ) { vOut6.push_back( bbGetInputIn6()[i] ); }
98                         if ( i < bbGetInputIn7().size() ) { vOut7.push_back( bbGetInputIn7()[i] ); }
99                         if ( i < bbGetInputIn8().size() ) { vOut8.push_back( bbGetInputIn8()[i] ); }
100                         if ( i < bbGetInputIn9().size() ) { vOut9.push_back( bbGetInputIn9()[i] ); }
101                 } // if pos
102         } // for i
103         
104         bbSetOutputOut0( vOut0 );
105         bbSetOutputOut1( vOut1 );
106         bbSetOutputOut2( vOut2 );
107         bbSetOutputOut3( vOut3 );
108         bbSetOutputOut4( vOut4 );
109         bbSetOutputOut5( vOut5 );
110         bbSetOutputOut6( vOut6 );
111         bbSetOutputOut7( vOut7 );
112         bbSetOutputOut8( vOut8 );
113         bbSetOutputOut9( vOut9 );
114 }
115
116 void VectorFilterString::InsertStringPos()
117 {
118     std::vector<std::string> vOut0;
119     std::vector<std::string> vOut1;
120     std::vector<std::string> vOut2;
121     std::vector<std::string> vOut3;
122     std::vector<std::string> vOut4;
123     std::vector<std::string> vOut5;
124     std::vector<std::string> vOut6;
125     std::vector<std::string> vOut7;
126     std::vector<std::string> vOut8;
127     std::vector<std::string> vOut9;
128     int i,size      = bbGetInputIn0().size();
129     std::string sk1 = bbGetInputsk1();
130     int pos         = atoi( bbGetInputsk2().c_str() );
131     for (i=0; i<size; i++)
132     {
133         vOut0.push_back( bbGetInputIn0()[i].insert(pos,sk1) );
134         if ( i < bbGetInputIn1().size() ) { vOut1.push_back( bbGetInputIn1()[i].insert(pos,sk1) ); }
135         if ( i < bbGetInputIn2().size() ) { vOut2.push_back( bbGetInputIn2()[i].insert(pos,sk1) ); }
136         if ( i < bbGetInputIn3().size() ) { vOut3.push_back( bbGetInputIn3()[i].insert(pos,sk1) ); }
137         if ( i < bbGetInputIn4().size() ) { vOut4.push_back( bbGetInputIn4()[i].insert(pos,sk1) ); }
138         if ( i < bbGetInputIn5().size() ) { vOut5.push_back( bbGetInputIn5()[i].insert(pos,sk1) ); }
139         if ( i < bbGetInputIn6().size() ) { vOut6.push_back( bbGetInputIn6()[i].insert(pos,sk1) ); }
140         if ( i < bbGetInputIn7().size() ) { vOut7.push_back( bbGetInputIn7()[i].insert(pos,sk1) ); }
141         if ( i < bbGetInputIn8().size() ) { vOut8.push_back( bbGetInputIn8()[i].insert(pos,sk1) ); }
142         if ( i < bbGetInputIn9().size() ) { vOut9.push_back( bbGetInputIn9()[i].insert(pos,sk1) ); }
143     } // for i
144     bbSetOutputOut0( vOut0 );
145     bbSetOutputOut1( vOut1 );
146     bbSetOutputOut2( vOut2 );
147     bbSetOutputOut3( vOut3 );
148     bbSetOutputOut4( vOut4 );
149     bbSetOutputOut5( vOut5 );
150     bbSetOutputOut6( vOut6 );
151     bbSetOutputOut7( vOut7 );
152     bbSetOutputOut8( vOut8 );
153     bbSetOutputOut9( vOut9 );
154 }
155
156 void VectorFilterString::InvertLists()
157 {
158     std::vector<std::string> vOut0;
159     std::vector<std::string> vOut1;
160     std::vector<std::string> vOut2;
161     std::vector<std::string> vOut3;
162     std::vector<std::string> vOut4;
163     std::vector<std::string> vOut5;
164     std::vector<std::string> vOut6;
165     std::vector<std::string> vOut7;
166     std::vector<std::string> vOut8;
167     std::vector<std::string> vOut9;
168     int i,size      = bbGetInputIn0().size();
169     for (i=size-1; i>=0; i--)
170     {
171             if ( i < bbGetInputIn0().size() ) { vOut0.push_back( bbGetInputIn0()[i] );  }
172             if ( i < bbGetInputIn1().size() ) { vOut1.push_back( bbGetInputIn1()[i] );  }
173             if ( i < bbGetInputIn2().size() ) { vOut2.push_back( bbGetInputIn2()[i] );  }
174             if ( i < bbGetInputIn3().size() ) { vOut3.push_back( bbGetInputIn3()[i] );  }
175             if ( i < bbGetInputIn4().size() ) { vOut4.push_back( bbGetInputIn4()[i] );  }
176             if ( i < bbGetInputIn5().size() ) { vOut5.push_back( bbGetInputIn5()[i] );  }
177             if ( i < bbGetInputIn6().size() ) { vOut6.push_back( bbGetInputIn6()[i] );  }
178             if ( i < bbGetInputIn7().size() ) { vOut7.push_back( bbGetInputIn7()[i] );  }
179             if ( i < bbGetInputIn8().size() ) { vOut8.push_back( bbGetInputIn8()[i] );  }
180             if ( i < bbGetInputIn9().size() ) { vOut9.push_back( bbGetInputIn9()[i] );  }
181     } // for i
182     bbSetOutputOut0( vOut0 );
183     bbSetOutputOut1( vOut1 );
184     bbSetOutputOut2( vOut2 );
185     bbSetOutputOut3( vOut3 );
186     bbSetOutputOut4( vOut4 );
187     bbSetOutputOut5( vOut5 );
188     bbSetOutputOut6( vOut6 );
189     bbSetOutputOut7( vOut7 );
190     bbSetOutputOut8( vOut8 );
191     bbSetOutputOut9( vOut9 );
192 }
193
194
195 void VectorFilterString::SwitchElement(std::vector<std::string> *pVec, int i, int ii )
196 {
197     std::string tmp;
198     
199     if  ( ( i < pVec->size() ) && ( ii < pVec->size() ) )
200     {
201         tmp         = (*pVec)[i];
202         (*pVec)[i]  = (*pVec)[ii];
203         (*pVec)[ii] = tmp;
204     } // if size
205 }
206
207 void VectorFilterString::OrderLists()
208 {
209     std::vector<std::string> vOut0=bbGetInputIn0();
210     std::vector<std::string> vOut1=bbGetInputIn1();
211     std::vector<std::string> vOut2=bbGetInputIn2();
212     std::vector<std::string> vOut3=bbGetInputIn3();
213     std::vector<std::string> vOut4=bbGetInputIn4();
214     std::vector<std::string> vOut5=bbGetInputIn5();
215     std::vector<std::string> vOut6=bbGetInputIn6();
216     std::vector<std::string> vOut7=bbGetInputIn7();
217     std::vector<std::string> vOut8=bbGetInputIn8();
218     std::vector<std::string> vOut9=bbGetInputIn9();
219     int i,ii,size      = bbGetInputIn0().size();
220     bool ok;
221     for (i=0; i<size; i++)
222     {
223         for (ii=i; ii<size; ii++)
224         {
225             ok=false;
226             if (bbGetInputType()==5)
227             {
228                 if ( vOut0[i] > vOut0[ii] )
229                 {
230                     ok = true;
231                 }  // if vIn0[i] > vIn0[ii]     // string version
232             } // if Type == 5
233             if (bbGetInputType()==6)
234             {
235 //                if ( std::stod( vOut0[i] ) > std::stod( vOut0[ii] ) )
236                 if ( ::atof( vOut0[i].c_str() ) > ::atof( vOut0[ii].c_str() ) )
237                 {
238                     ok = true;
239                 }  // if vIn0[i] > vIn0[ii]     double version
240             } // if Type == 6
241
242             if (ok==true)
243             {
244                 SwitchElement( &vOut0 , i ,ii );
245                 SwitchElement( &vOut1 , i ,ii );
246                 SwitchElement( &vOut2 , i ,ii );
247                 SwitchElement( &vOut3 , i ,ii );
248                 SwitchElement( &vOut4 , i ,ii );
249                 SwitchElement( &vOut5 , i ,ii );
250                 SwitchElement( &vOut6 , i ,ii );
251                 SwitchElement( &vOut7 , i ,ii );
252                 SwitchElement( &vOut8 , i ,ii );
253                 SwitchElement( &vOut9 , i ,ii );
254             }  // if ok
255         } // for ii
256     } // for i
257     bbSetOutputOut0( vOut0 );
258     bbSetOutputOut1( vOut1 );
259     bbSetOutputOut2( vOut2 );
260     bbSetOutputOut3( vOut3 );
261     bbSetOutputOut4( vOut4 );
262     bbSetOutputOut5( vOut5 );
263     bbSetOutputOut6( vOut6 );
264     bbSetOutputOut7( vOut7 );
265     bbSetOutputOut8( vOut8 );
266     bbSetOutputOut9( vOut9 );
267 }
268
269 void VectorFilterString::SubString()
270 {
271     std::vector<std::string> vOut0;
272     std::vector<std::string> vOut1;
273     std::vector<std::string> vOut2;
274     std::vector<std::string> vOut3;
275     std::vector<std::string> vOut4;
276     std::vector<std::string> vOut5;
277     std::vector<std::string> vOut6;
278     std::vector<std::string> vOut7;
279     std::vector<std::string> vOut8;
280     std::vector<std::string> vOut9;
281     int i,size  = bbGetInputIn0().size();
282     int sk1     = atoi( bbGetInputsk1().c_str() );
283     int sk2     = atoi( bbGetInputsk2().c_str() );
284     for (i=0; i<size; i++)
285     {
286             if ( i < bbGetInputIn0().size() ) { vOut0.push_back( bbGetInputIn0()[i].substr(sk1,sk2) );  }
287             if ( i < bbGetInputIn1().size() ) { vOut1.push_back( bbGetInputIn1()[i].substr(sk1,sk2) );  }
288             if ( i < bbGetInputIn2().size() ) { vOut2.push_back( bbGetInputIn2()[i].substr(sk1,sk2) );  }
289             if ( i < bbGetInputIn3().size() ) { vOut3.push_back( bbGetInputIn3()[i].substr(sk1,sk2) );  }
290             if ( i < bbGetInputIn4().size() ) { vOut4.push_back( bbGetInputIn4()[i].substr(sk1,sk2) );  }
291             if ( i < bbGetInputIn5().size() ) { vOut5.push_back( bbGetInputIn5()[i].substr(sk1,sk2) );  }
292             if ( i < bbGetInputIn6().size() ) { vOut6.push_back( bbGetInputIn6()[i].substr(sk1,sk2) );  }
293             if ( i < bbGetInputIn7().size() ) { vOut7.push_back( bbGetInputIn7()[i].substr(sk1,sk2) );  }
294             if ( i < bbGetInputIn8().size() ) { vOut8.push_back( bbGetInputIn8()[i].substr(sk1,sk2) );  }
295             if ( i < bbGetInputIn9().size() ) { vOut9.push_back( bbGetInputIn9()[i].substr(sk1,sk2) );  }
296     } // for i
297     bbSetOutputOut0( vOut0 );
298     bbSetOutputOut1( vOut1 );
299     bbSetOutputOut2( vOut2 );
300     bbSetOutputOut3( vOut3 );
301     bbSetOutputOut4( vOut4 );
302     bbSetOutputOut5( vOut5 );
303     bbSetOutputOut6( vOut6 );
304     bbSetOutputOut7( vOut7 );
305     bbSetOutputOut8( vOut8 );
306     bbSetOutputOut9( vOut9 );
307 }
308
309
310 void VectorFilterString::EraseDuplicateLines()
311 {
312     std::vector< std::vector< std::string > * >  pLstVec;
313     std::vector< std::vector< std::string > * >  pLstVecOut;
314     std::vector< std::string > In0 = bbGetInputIn0();
315     std::vector< std::string > In1 = bbGetInputIn1();
316     std::vector< std::string > In2 = bbGetInputIn2();
317     std::vector< std::string > In3 = bbGetInputIn3();
318     std::vector< std::string > In4 = bbGetInputIn4();
319     std::vector< std::string > In5 = bbGetInputIn5();
320     std::vector< std::string > In6 = bbGetInputIn6();
321     std::vector< std::string > In7 = bbGetInputIn7();
322     std::vector< std::string > In8 = bbGetInputIn8();
323     std::vector< std::string > In9 = bbGetInputIn9();
324     if (bbGetInputIn0().size()!=0) { pLstVec.push_back( &In0 ); }
325     if (bbGetInputIn1().size()!=0) { pLstVec.push_back( &In1 ); }
326     if (bbGetInputIn2().size()!=0) { pLstVec.push_back( &In2 ); }
327     if (bbGetInputIn3().size()!=0) { pLstVec.push_back( &In3 ); }
328     if (bbGetInputIn4().size()!=0) { pLstVec.push_back( &In4 ); }
329     if (bbGetInputIn5().size()!=0) { pLstVec.push_back( &In5 ); }
330     if (bbGetInputIn6().size()!=0) { pLstVec.push_back( &In6 ); }
331     if (bbGetInputIn7().size()!=0) { pLstVec.push_back( &In7 ); }
332     if (bbGetInputIn8().size()!=0) { pLstVec.push_back( &In8 ); }
333     if (bbGetInputIn9().size()!=0) { pLstVec.push_back( &In9 ); }
334     std::vector< std::string > Out0;
335     std::vector< std::string > Out1;
336     std::vector< std::string > Out2;
337     std::vector< std::string > Out3;
338     std::vector< std::string > Out4;
339     std::vector< std::string > Out5;
340     std::vector< std::string > Out6;
341     std::vector< std::string > Out7;
342     std::vector< std::string > Out8;
343     std::vector< std::string > Out9;
344     pLstVecOut.push_back( &Out0 );
345     pLstVecOut.push_back( &Out1 );
346     pLstVecOut.push_back( &Out2 );
347     pLstVecOut.push_back( &Out3 );
348     pLstVecOut.push_back( &Out4 );
349     pLstVecOut.push_back( &Out5 );
350     pLstVecOut.push_back( &Out6 );
351     pLstVecOut.push_back( &Out7 );
352     pLstVecOut.push_back( &Out8 );
353     pLstVecOut.push_back( &Out9 );
354     std::string tmp1;
355     std::string tmp2;
356         if (bbGetInputIn0().size()!=0)  // At least one element
357         {
358             bool okSizeVec=true;
359             int ipLstvec;
360             for (ipLstvec=1;ipLstvec<pLstVec.size();ipLstvec++)
361             {
362                 if ( (*pLstVec[ipLstvec]).size()!=(*pLstVec[0]).size() )  { okSizeVec=false; }
363             }
364             if ( okSizeVec==false)
365             {
366                 printf("EED VectorFilterString::Process WARNING! vectors are not of the same size.\n");
367             } else {
368                 int iLine;
369                 int ipLstvec2;
370                 bool okLine;
371                 int size=0;
372                 if (bbGetInputType()==8) { size = pLstVec.size(); }
373                 if (bbGetInputType()==9) { size = 1;              }
374                 for (iLine=0 ; iLine < (*pLstVec[0]).size() ; iLine++ )
375                 {
376                     okLine=false;
377 //                    for ( ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
378 //                    for ( ipLstvec2=0 ; ipLstvec2<1 ; ipLstvec2++)
379                     for ( ipLstvec2=0 ; ipLstvec2<size   ; ipLstvec2++)
380                     {
381                         tmp1=(*pLstVec[ipLstvec2])[iLine];
382                         tmp2=(*pLstVec[ipLstvec2])[iLine-1];
383                         if ( tmp1.compare(tmp2)!=0 )  { okLine=true; }
384                     } // for ipLstVec2
385                     if ( (okLine==true) || (iLine==0) )
386                     {
387                         for (ipLstvec2=0 ; ipLstvec2<pLstVec.size() ; ipLstvec2++)
388                         {
389                             (*pLstVecOut[ipLstvec2]).push_back( (*pLstVec[ipLstvec2])[iLine] );
390                         } // for
391                     } // if okLine
392                 } // for iLine
393             } // if okSizeVec
394         } // bbGetInputIn0()  size
395     bbSetOutputOut0( Out0 );
396     bbSetOutputOut1( Out1 );
397     bbSetOutputOut2( Out2 );
398     bbSetOutputOut3( Out3 );
399     bbSetOutputOut4( Out4 );
400     bbSetOutputOut5( Out5 );
401     bbSetOutputOut6( Out6 );
402     bbSetOutputOut7( Out7 );
403     bbSetOutputOut8( Out8 );
404     bbSetOutputOut9( Out9 );
405 }
406
407
408
409 void VectorFilterString::Process()
410 {
411
412 // THE MAIN PROCESSING METHOD BODY
413 //   Here we simply set the input 'In' value to the output 'Out'
414 //   And print out the output value
415 // INPUT/OUTPUT ACCESSORS ARE OF THE FORM :
416 //    void bbSet{Input|Output}NAME(const TYPE&)
417 //    const TYPE& bbGet{Input|Output}NAME() const 
418 //    Where :
419 //    * NAME is the name of the input/output
420 //      (the one provided in the attribute 'name' of the tag 'input')
421 //    * TYPE is the C++ type of the input/output
422 //      (the one provided in the attribute 'type' of the tag 'input')
423
424 //    bbSetOutputOut( bbGetInputIn() );
425 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
426   
427         if (bbGetInputType()==0) 
428         {
429         CountConnectedRepetitions();
430         }
431
432     if (bbGetInputType()==2)
433     {
434         FilterByFindinIn0();
435     }
436
437     if (bbGetInputType()==3)
438     {
439         InsertStringPos();
440     }
441     
442     if (bbGetInputType()==4)
443     {
444         InvertLists();
445     }
446
447     if ( (bbGetInputType()==5)  ||  (bbGetInputType()==6)  )
448     {
449         OrderLists();
450     }
451     
452     if (bbGetInputType()==7)
453     {
454         SubString();
455     }
456     if ( (bbGetInputType()==8)  ||  (bbGetInputType()==9)  )
457     {
458         EraseDuplicateLines();
459     }
460 }
461 //===== 
462 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
463 //===== 
464 void VectorFilterString::bbUserSetDefaultValues()
465 {
466
467 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
468 //    Here we initialize the input 'In' to 0
469    bbSetInputType(0);
470    bbSetInputsk1("");
471    bbSetInputsk2("");
472 }
473 //===== 
474 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
475 //===== 
476 void VectorFilterString::bbUserInitializeProcessing()
477 {
478
479 //  THE INITIALIZATION METHOD BODY :
480 //    Here does nothing 
481 //    but this is where you should allocate the internal/output pointers 
482 //    if any 
483
484   
485 }
486 //===== 
487 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
488 //===== 
489 void VectorFilterString::bbUserFinalizeProcessing()
490 {
491
492 //  THE FINALIZATION METHOD BODY :
493 //    Here does nothing 
494 //    but this is where you should desallocate the internal/output pointers 
495 //    if any
496   
497 }
498
499 } // EO namespace bbstd
500
501