+void MEDFileMeshL2::RenameFamiliesPatternInternal(std::vector< std::pair<std::string,std::pair<int,std::vector<std::string> > > >& crudeFams, RenameFamiliesPatternFunc func)
+{
+ std::size_t ii(0);
+ std::vector<std::string> fams(crudeFams.size());
+ for(std::vector< std::pair<std::string,std::pair<int,std::vector<std::string> > > >::const_iterator it=crudeFams.begin();it!=crudeFams.end();it++,ii++)
+ fams[ii]=(*it).first;
+ if(!func(fams))
+ return ;
+ ii=0;
+ for(std::vector< std::pair<std::string,std::pair<int,std::vector<std::string> > > >::iterator it=crudeFams.begin();it!=crudeFams.end();it++,ii++)
+ (*it).first=fams[ii];
+}
+
+/*!
+ * This method is dedicated to the killers that use a same family name to store different family ids. MED file API authorizes it.
+ * So this method renames families (if needed generally not !) in order to have a discriminant name for families.
+ */
+void MEDFileMeshL2::RenameFamiliesFromFileToMemInternal(std::vector< std::pair<std::string,std::pair<int,std::vector<std::string> > > >& crudeFams)
+{
+ RenameFamiliesPatternInternal(crudeFams,RenameFamiliesFromFileToMem);
+}
+
+bool MEDFileMeshL2::RenameFamiliesFromFileToMem(std::vector< std::string >& famNames)
+{
+ std::map<std::string,int> m;
+ std::set<std::string> s;
+ for(std::vector< std::string >::const_iterator it=famNames.begin();it!=famNames.end();it++)
+ {
+ if(s.find(*it)!=s.end())
+ m[*it]=0;
+ s.insert(*it);
+ }
+ if(m.empty())
+ return false;// the general case !
+ for(std::vector< std::string >::iterator it=famNames.begin();it!=famNames.end();it++)
+ {
+ std::map<std::string,int>::iterator it2(m.find(*it));
+ if(it2!=m.end())
+ {
+ std::ostringstream oss; oss << *it << ZE_SEP_FOR_FAMILY_KILLERS << std::setfill('0') << std::setw(ZE_SEP2_FOR_FAMILY_KILLERS) << (*it2).second++;
+ *it=oss.str();
+ }
+ }
+ return true;
+}
+
+/*!
+ * This method is dedicated to the killers that use a same family name to store different family ids. MED file API authorizes it.
+ * So this method renames families (if needed generally not !) in order to have a discriminant name for families.
+ */
+void MEDFileMeshL2::RenameFamiliesFromMemToFileInternal(std::vector< std::pair<std::string,std::pair<int,std::vector<std::string> > > >& crudeFams)
+{
+ RenameFamiliesPatternInternal(crudeFams,RenameFamiliesFromMemToFile);
+}
+
+bool MEDFileMeshL2::RenameFamiliesFromMemToFile(std::vector< std::string >& famNames)
+{
+ bool isSmthingStrange(false);
+ for(std::vector< std::string >::const_iterator it=famNames.begin();it!=famNames.end();it++)
+ {
+ std::size_t found((*it).find(ZE_SEP_FOR_FAMILY_KILLERS));
+ if(found!=std::string::npos)
+ isSmthingStrange=true;
+ }
+ if(!isSmthingStrange)
+ return false;
+ // pattern matching
+ std::map< std::string, std::vector<std::string> > m;
+ for(std::vector< std::string >::const_iterator it=famNames.begin();it!=famNames.end();it++)
+ {
+ std::size_t found((*it).find(ZE_SEP_FOR_FAMILY_KILLERS));
+ if(found!=std::string::npos && found>=1)
+ {
+ std::string s1((*it).substr(found+sizeof(ZE_SEP_FOR_FAMILY_KILLERS)-1));
+ if(s1.size()!=ZE_SEP2_FOR_FAMILY_KILLERS)
+ continue;
+ int k(-1);
+ std::istringstream iss(s1);
+ iss >> k;
+ bool isOK((iss.rdstate() & ( std::istream::failbit | std::istream::eofbit)) == std::istream::eofbit);
+ if(isOK && k>=0)
+ {
+ std::string s0((*it).substr(0,found));
+ m[s0].push_back(*it);
+ }
+ }
+ }
+ if(m.empty())
+ return false;
+ // filtering
+ std::map<std::string,std::string> zeMap;
+ for(std::map< std::string, std::vector<std::string> >::const_iterator it=m.begin();it!=m.end();it++)
+ {
+ if((*it).second.size()==1)
+ continue;
+ for(std::vector<std::string>::const_iterator it1=(*it).second.begin();it1!=(*it).second.end();it1++)
+ zeMap[*it1]=(*it).first;
+ }
+ if(zeMap.empty())
+ return false;
+ // traduce
+ for(std::vector< std::string >::iterator it=famNames.begin();it!=famNames.end();it++)
+ {
+ std::map<std::string,std::string>::iterator it1(zeMap.find(*it));
+ if(it1!=zeMap.end())
+ *it=(*it1).second;
+ }
+ return true;
+}
+
+MEDCoupling::MEDCouplingAxisType MEDFileMeshL2::TraduceAxisType(med_axis_type at)
+{
+ switch(at)
+ {
+ case MED_CARTESIAN:
+ return AX_CART;
+ case MED_CYLINDRICAL:
+ return AX_CYL;
+ case MED_SPHERICAL:
+ return AX_SPHER;
+ case MED_UNDEF_AXIS_TYPE:
+ return AX_CART;
+ default:
+ throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisType : unrecognized axis type !");
+ }
+}
+
+MEDCoupling::MEDCouplingAxisType MEDFileMeshL2::TraduceAxisTypeStruct(med_grid_type gt)
+{
+ switch(gt)
+ {
+ case MED_CARTESIAN_GRID:
+ return AX_CART;
+ case MED_POLAR_GRID:
+ return AX_CYL;
+ default:
+ throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisTypeStruct : only Cartesian and Cylindrical supported by MED file !");
+ }
+}
+
+med_axis_type MEDFileMeshL2::TraduceAxisTypeRev(MEDCoupling::MEDCouplingAxisType at)
+{
+ switch(at)
+ {
+ case AX_CART:
+ return MED_CARTESIAN;
+ case AX_CYL:
+ return MED_CYLINDRICAL;
+ case AX_SPHER:
+ return MED_SPHERICAL;
+ default:
+ throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisTypeRev : unrecognized axis type !");
+ }
+}
+
+med_grid_type MEDFileMeshL2::TraduceAxisTypeRevStruct(MEDCoupling::MEDCouplingAxisType at)
+{
+ switch(at)
+ {
+ case AX_CART:
+ return MED_CARTESIAN_GRID;
+ case AX_CYL:
+ return MED_POLAR_GRID;
+ case AX_SPHER:
+ return MED_POLAR_GRID;
+ default:
+ throw INTERP_KERNEL::Exception("MEDFileMeshL2::TraduceAxisTypeRevStruct : unrecognized axis type !");
+ }
+}
+