Changeset 1050 for XIOS/trunk/src


Ignore:
Timestamp:
02/07/17 11:52:03 (7 years ago)
Author:
ymipsl
Message:
  • Add label attribute for axis
  • if label attribute is present, then only only string label for each level will be output in netcdf file, ie value and bounds will not be output.

YM

Location:
XIOS/trunk/src
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/array_new.hpp

    r731 r1050  
    539539        TinyVector<int,N_rank> vect; 
    540540        size_t ne; 
    541  
     541         
    542542        ret =  buffer.get(numDim); 
    543543        ret &= buffer.get(vect.data(), N_rank); 
     
    551551      } 
    552552  }; 
     553 
     554 
     555#define macro(NRANK)\ 
     556\ 
     557  template <>\ 
     558  inline size_t CArray<StdString,NRANK>::size(void) const\ 
     559  {\ 
     560    size_t size=(1 + NRANK) * sizeof(int) ;\ 
     561    Array<StdString,NRANK>::const_iterator it, itb=this->begin(), ite=this->end() ;\ 
     562\ 
     563    for(it=itb;it!=ite;++it)\ 
     564    {\ 
     565      size+= sizeof(size_t) ;\ 
     566      size+= (*it).size();\ 
     567    } \ 
     568    return size ;\ 
     569  }\ 
     570\ 
     571/* for array string this function is an evaluation of maximum size of the array, considering stringArrayLen is the maximum size of the strings*/ \ 
     572  template <>\ 
     573  inline size_t CArray<StdString,NRANK>::size(sizeType numElements)\ 
     574  {\ 
     575    return (NRANK + 1) * sizeof(int) + numElements * stringArrayLen;\ 
     576  }\ 
     577  \ 
     578  template <>\ 
     579  inline bool CArray<StdString,NRANK>::toBuffer(CBufferOut& buffer) const\ 
     580  {\ 
     581    bool ret;\ 
     582    ret =  buffer.put(this->dimensions());\ 
     583    ret &= buffer.put(this->shape().data(), this->dimensions());\ 
     584\ 
     585    Array<StdString,NRANK>::const_iterator it, itb=this->begin(), ite=this->end() ;\ 
     586\ 
     587    for(it=itb;it!=ite;++it)\ 
     588    {\ 
     589      ret &= buffer.put((*it).size()) ;\ 
     590      ret &= buffer.put((*it).data(),(*it).size());\ 
     591    } \ 
     592    return ret;\ 
     593  }\ 
     594\ 
     595  template <>\ 
     596  inline bool CArray<StdString,NRANK>::fromBuffer(CBufferIn& buffer)\ 
     597  {\ 
     598     bool ret;\ 
     599     int numDim;\ 
     600     TinyVector<int,NRANK> vect;\ 
     601     size_t ne;\ 
     602\ 
     603     ret =  buffer.get(numDim);\ 
     604     ret &= buffer.get(vect.data(), NRANK);\ 
     605     this->resize(vect);\ 
     606\ 
     607     Array<StdString,NRANK>::iterator it, itb=this->begin(), ite=this->end() ;\ 
     608     for(it=itb;it!=ite;++it)\ 
     609     {\ 
     610       ret &= buffer.get(ne) ;\ 
     611       char* str = new char[ne] ;\ 
     612       ret &= buffer.get(str, ne);\ 
     613       *it = string(str,ne) ;\ 
     614       delete [] str ;\ 
     615     }\ 
     616     initialized = true;\ 
     617     return ret;\ 
     618  } 
     619macro(1) 
     620macro(2) 
     621macro(3) 
     622macro(4) 
     623macro(5) 
     624macro(6) 
     625macro(7) 
     626 
     627#undef macro 
    553628 
    554629  template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray<T_numtype,N_rank>& array) 
  • XIOS/trunk/src/attribute_array_decl.cpp

    r932 r1050  
    1717  template class CAttributeArray<bool,6> ; 
    1818  template class CAttributeArray<bool,7> ; 
     19  template class CAttributeArray<StdString,1> ; 
     20  template class CAttributeArray<StdString,2> ; 
    1921} 
  • XIOS/trunk/src/config/axis_attribute.conf

    r1045 r1050  
    3030DECLARE_ARRAY(double, 2 , bounds) 
    3131DECLARE_ATTRIBUTE(int,       prec) 
     32DECLARE_ARRAY(StdString    ,1    , label) 
  • XIOS/trunk/src/generate_interface_impl.hpp

    r966 r1050  
    547547#undef macro 
    548548 
     549#define macro(N,EXTENT)\ 
     550  template <>\ 
     551  void CInterface::AttributeCInterface<CArray<StdString,N> >(ostream& oss, const string& className, const string& name)\ 
     552  { \ 
     553    oss << "void cxios_set_" << className << "_" << name << "(" << className << "_Ptr " << className << "_hdl, " << "char* " << name <<", int str_len, int* str_size, int* extent)" << iendl; \ 
     554    oss << "{" << iendl; \ 
     555    oss << "  CTimer::get(\"XIOS\").resume();" << iendl; \ 
     556    oss << "  "<<className<<"_hdl->"<<name<<".resize(shape("<<EXTENT<<"));"<<iendl;\ 
     557    oss << "  Array<StdString,"<<#N<<">::iterator it, itb="<<className<<"_hdl->"<<name<<".begin(), ite="<<className<<"_hdl->"<<name<<".end() ;"<<iendl ;\ 
     558    oss << "  int i, n ;"<< iendl; \ 
     559    oss << "  for(it=itb, i=0, n=0 ; it!=ite ; ++it,n+=str_len,++i) *it=StdString(&"<<name<<"[n],str_size[i]) ;"<<iendl ;\ 
     560    oss << "  CTimer::get(\"XIOS\").suspend();" << iendl; \ 
     561    oss << "}" << std::endl; \ 
     562    oss << iendl; \ 
     563    oss << "void cxios_get_" << className << "_" << name << "(" << className << "_Ptr " << className << "_hdl, " << "char* " << name << ", int str_size, int* extent)" << iendl; \ 
     564    oss << "{" << iendl; \ 
     565    oss << "  CTimer::get(\"XIOS\").resume();" << iendl; \ 
     566    oss << "  Array<StdString,"<<#N<<">::const_iterator it, itb="<<className<<"_hdl->"<<name<<".getInheritedValue().begin(), ite="<<className<<"_hdl->"<<name<<".getInheritedValue().end() ;" << iendl; \ 
     567    oss << "  int n ;"<< iendl; \ 
     568    oss << "  for(it=itb, n=0 ; it!=ite ; ++it, n+=str_size) it->copy(&"<<name<<"[n],it->size()) ; "<< iendl; \ 
     569    oss << "  CTimer::get(\"XIOS\").suspend();" << iendl; \ 
     570    oss << "}" << std::endl; \ 
     571  } 
     572 
     573macro(1,"extent[0]") 
     574macro(2,"extent[0],extent[1]") 
     575macro(3,"extent[0],extent[1],extent[2]") 
     576macro(4,"extent[0],extent[1],extent[2],extent[3]") 
     577macro(5,"extent[0],extent[1],extent[2],extent[3],extent[4]") 
     578macro(6,"extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]") 
     579macro(7,"extent[0],extent[1],extent[2],extent[3],extent[4],extent[5],extent[6]") 
     580#undef macro 
    549581// ///////////////////////////////////////////////// 
    550582// //          Fortran 2003 Interface             // 
     
    705737  #undef macro 
    706738 
     739#define macro(T)\ 
     740  template <>\ 
     741  void CInterface::AttributeFortran2003Interface<CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\ 
     742  {\ 
     743    oss << "SUBROUTINE cxios_set_" << className << "_" << name << "(" << className << "_hdl, " << name << ", str_len, str_size, extent) BIND(C)" << iendl; \ 
     744    oss << "  USE ISO_C_BINDING" << iendl; \ 
     745    oss << "  INTEGER (kind = C_INTPTR_T), VALUE       :: " << className << "_hdl" << iendl; \ 
     746    oss << "  CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: " << name << iendl; \ 
     747    oss << "  INTEGER (kind = C_INT), VALUE            :: str_len" << iendl; \ 
     748    oss << "  INTEGER (kind = C_INT), DIMENSION(*)     :: str_size" << iendl; \ 
     749    oss << "  INTEGER (kind = C_INT), DIMENSION(*)     :: extent" << iendl; \ 
     750    oss << "END SUBROUTINE cxios_set_" << className << "_" << name << std::endl; \ 
     751    oss << iendl; \ 
     752    oss << "SUBROUTINE cxios_get_" << className << "_" << name << "(" << className << "_hdl, " << name << ", str_size, extent) BIND(C)" << iendl; \ 
     753    oss << "  USE ISO_C_BINDING" << iendl; \ 
     754    oss << "  INTEGER (kind = C_INTPTR_T), VALUE       :: " << className << "_hdl" << iendl; \ 
     755    oss << "  CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: " << name << iendl; \ 
     756    oss << "  INTEGER (kind = C_INT), VALUE            :: str_size" << iendl; \ 
     757    oss << "  INTEGER (kind = C_INT), DIMENSION(*)     :: extent" << iendl; \ 
     758    oss << "END SUBROUTINE cxios_get_" << className << "_" << name << std::endl; \ 
     759  } 
     760  macro(1) 
     761  macro(2) 
     762  macro(3) 
     763  macro(4) 
     764  macro(5) 
     765  macro(6) 
     766  macro(7) 
     767 
     768#undef macro 
     769 
    707770#define macro(T) \ 
    708771  template <> \ 
     
    808871 
    809872#undef macro 
     873 
     874#define macro(T,EXTENT)\ 
     875  template <> \ 
     876  void CInterface::AttributeFortranInterfaceDeclaration<CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\ 
     877  {\ 
     878    oss << "CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: " << name << "("<<EXTENT<<")"; \ 
     879  }\ 
     880\ 
     881  template <>\  
     882  void CInterface::AttributeFortranInterfaceGetDeclaration<CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\ 
     883  {\ 
     884    oss << "CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: " << name << "("<<EXTENT<<")"; \ 
     885  } 
     886  macro(1,":") 
     887  macro(2,":,:") 
     888  macro(3,":,:,:") 
     889  macro(4,":,:,:,:") 
     890  macro(5,":,:,:,:,:") 
     891  macro(6,":,:,:,:,:,:") 
     892  macro(7,":,:,:,:,:,:,:") 
     893 
     894#undef macro 
     895 
     896 
     897 
     898 
     899   
    810900 
    811901#define macro(T) \ 
     
    9471037#undef macro 
    9481038 
     1039#define macro(T)\ 
     1040  template <>\ 
     1041  void CInterface::AttributeFortranInterfaceBody< CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\ 
     1042  {\ 
     1043     oss << "IF (PRESENT(" << name << "_)) THEN" << iendl; \ 
     1044     oss << "  CALL cxios_set_" << className << "_" << name << " &" << iendl; \ 
     1045     oss << "(" << className << "_hdl%daddr, " << name <<"_, LEN("<<name<<"_), LEN_TRIM("<<name<< "_), SHAPE(" << name << "_))" << iendl; \ 
     1046     oss << "ENDIF"; \ 
     1047  } 
     1048 
     1049  macro(1) 
     1050  macro(2) 
     1051#undef macro 
     1052 
    9491053#define macro(T) \ 
    9501054  template <>  \ 
     
    10841188 
    10851189#undef macro 
     1190 
     1191#define macro(T)\ 
     1192  template <> \ 
     1193  void CInterface::AttributeFortranInterfaceGetBody< CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\ 
     1194  {\ 
     1195    oss << "IF (PRESENT(" << name << "_)) THEN" << iendl; \ 
     1196    oss << "  CALL cxios_get_" << className << "_" << name << " &" << iendl; \ 
     1197    oss << "(" << className << "_hdl%daddr, " << name << "_, LEN("<<name<<"_), SHAPE(" << name << "_))" << iendl; \ 
     1198    oss << "ENDIF"; \ 
     1199  } 
     1200  macro(1) 
     1201  macro(2) 
     1202  macro(3) 
     1203  macro(4) 
     1204  macro(5) 
     1205  macro(6) 
     1206  macro(7) 
     1207 
     1208#undef macro 
     1209   
    10861210} 
    10871211#endif 
  • XIOS/trunk/src/io/nc4_data_output.cpp

    r1048 r1050  
    10601060        else if (axis->prec==8)   typePrec =  NC_DOUBLE ; 
    10611061          
     1062        if (!axis->label.isEmpty()) typePrec = NC_CHAR ; 
     1063        string strId="str_len" ; 
    10621064        try 
    10631065        { 
    10641066          SuperClassWriter::addDimension(axisid, zoom_size); 
     1067          if (!axis->label.isEmpty()) SuperClassWriter::addDimension(strId, stringArrayLen); 
    10651068          if (axis->hasValue) 
    10661069          { 
    10671070            dims.push_back(axisid); 
     1071            if (!axis->label.isEmpty()) dims.push_back(strId); 
    10681072            SuperClassWriter::addVariable(axisid, typePrec, dims); 
    10691073 
     
    11041108                CArray<double,1> axis_value(zoom_size_srv); 
    11051109                for (int i = 0; i < zoom_size_srv; i++) axis_value(i) = axis->value_srv(i); 
    1106                 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); 
    1107  
    1108                 if (!axis->bounds.isEmpty()) 
     1110                if (axis->label.isEmpty())  SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); 
     1111 
     1112                if (!axis->bounds.isEmpty() && axis->label.isEmpty()) 
    11091113                  SuperClassWriter::writeData(axis->bound_srv, axisBoundsId, isCollective, 0); 
    11101114 
     1115                if (! axis->label.isEmpty())  SuperClassWriter::writeData(axis->label_srv, axisid, isCollective, 0); 
     1116  
    11111117                SuperClassWriter::definition_start(); 
    1112  
    11131118                break; 
    11141119              } 
     
    11241129                startBounds[1] = 0; 
    11251130                countBounds[1] = 2; 
    1126                 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0, &start, &count); 
    1127  
    1128                 if (!axis->bounds.isEmpty()) 
     1131                if (axis->label.isEmpty()) SuperClassWriter::writeData(axis_value, axisid, isCollective, 0, &start, &count); 
     1132 
     1133                if (!axis->bounds.isEmpty()&& axis->label.isEmpty()) 
    11291134                  SuperClassWriter::writeData(axis->bound_srv, axisBoundsId, isCollective, 0, &startBounds, &countBounds); 
     1135 
     1136                if (! axis->label.isEmpty())  SuperClassWriter::writeData(axis->label_srv, axisid, isCollective, 0); 
    11301137 
    11311138                SuperClassWriter::definition_start(); 
  • XIOS/trunk/src/io/netCdfInterface.cpp

    r972 r1050  
    967967} 
    968968 
     969template<> 
     970int CNetCdfInterface::ncGetVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, char* data) 
     971{ 
     972  return nc_get_vara_text(ncid, varid, start, count, data); 
     973} 
     974 
    969975// Some specializations of putVariableType 
    970976template<> 
     
    984990{ 
    985991  return nc_put_vara_int(ncid, varid, start, count, data); 
     992} 
     993 
     994template<> 
     995int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const char* data) 
     996{ 
     997  return nc_put_vara_text(ncid, varid, start, count, data); 
    986998} 
    987999 
  • XIOS/trunk/src/io/netCdfInterface_decl.cpp

    r686 r1050  
    3333  macroPutVar(float) 
    3434  macroPutVar(int) 
    35  
     35  macroPutVar(char) 
     36   
    3637#define macroType(type, ncType) \ 
    3738  template<> nc_type CNetCdfInterface::getNcType<type>() { return ncType; } 
  • XIOS/trunk/src/io/onetcdf4.cpp

    r878 r1050  
    503503      void CONetCDF4::writeData_(int grpid, int varid, 
    504504                                 const std::vector<StdSize>& sstart, 
     505                                 const std::vector<StdSize>& scount, char* data) 
     506      { 
     507          CNetCdfInterface::putVaraType(grpid, varid, &sstart[0], &scount[0], data); 
     508      } 
     509       
     510      template <> 
     511 
     512      void CONetCDF4::writeData_(int grpid, int varid, 
     513                                 const std::vector<StdSize>& sstart, 
    505514                                 const std::vector<StdSize>& scount, const int* data) 
    506515      { 
    507516          CNetCdfInterface::putVaraType(grpid, varid, &sstart[0], &scount[0], data); 
    508517      } 
    509  
    510518      //--------------------------------------------------------------- 
    511519 
  • XIOS/trunk/src/io/onetcdf4_decl.cpp

    r924 r1050  
    1414  macro(double, 2) 
    1515  macro(double, 3) 
     16  macro(StdString, 1) 
    1617  
    1718  template void CONetCDF4::setDefaultValue<double>(const StdString & varname, const double* value) ; 
  • XIOS/trunk/src/io/onetcdf4_impl.hpp

    r685 r1050  
    3636  } 
    3737 
     38  template <> 
     39  void CONetCDF4::writeData(const CArray<StdString, 1>& data, const StdString & name, 
     40                            bool collective, StdSize record, 
     41                            const std::vector<StdSize> * start, 
     42                            const std::vector<StdSize> * count) 
     43  { 
     44    int grpid = this->getCurrentGroup(); 
     45    int varid = this->getVariable(name); 
     46    StdSize array_size = 1; 
     47    std::vector<StdSize> sstart, scount; 
     48 
     49    if (this->wmpi && collective) 
     50    CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE); 
     51    if (this->wmpi && !collective) 
     52    CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT); 
     53 
     54    this->getWriteDataInfos 
     55    (name, record, array_size,  sstart, scount, start, count); 
     56    if (data.numElements()*stringArrayLen != array_size) 
     57    { 
     58      ERROR("CONetCDF4::writeData(...)", 
     59      << "[ input array size = "  << data.numElements() 
     60      << ", intern array size = " << array_size 
     61      << " ] Invalid input data !" ); 
     62    } 
     63    char* ArrayStr ; 
     64    char *PtrArrayStr ; 
     65    PtrArrayStr=ArrayStr=new char[data.numElements()*stringArrayLen] ; 
     66    Array<StdString,1>::const_iterator it, itb=data.begin(), ite=data.end() ; 
     67    for(it=itb;it!=ite;++it,PtrArrayStr+=stringArrayLen) 
     68    { 
     69      it->copy(PtrArrayStr,it->size()) ; 
     70      PtrArrayStr[it->size()]='\0' ; 
     71    } 
     72    this->writeData_(grpid, varid, sstart, scount, ArrayStr); 
     73    delete [] ArrayStr ; 
     74  } 
     75 
    3876//---------------------------------------------------------------- 
    3977 
  • XIOS/trunk/src/node/axis.cpp

    r995 r1050  
    2727      , isDistributed_(false), hasBounds_(false), isCompressible_(false) 
    2828      , numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 
    29       , transformationMap_(), hasValue(false) 
     29      , transformationMap_(), hasValue(false), hasLabel(false) 
    3030   { 
    3131   } 
     
    3737      , isDistributed_(false), hasBounds_(false), isCompressible_(false) 
    3838      , numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 
    39       , transformationMap_(), hasValue(false) 
     39      , transformationMap_(), hasValue(false), hasLabel(false) 
    4040   { 
    4141   } 
     
    176176         if (hasBounds_) 
    177177           sizeValEvent += CArray<double,2>::size(2 * it->second.size()); 
     178  
     179         if (hasLabel) 
     180           sizeValEvent += CArray<StdString,1>::size(it->second.size()); 
    178181 
    179182         size_t size = CEventClient::headerSize + getId().size() + sizeof(size_t) + std::max(sizeIndexEvent, sizeValEvent); 
     
    261264      this->checkMask(); 
    262265      this->checkBounds(); 
     266      this->checkLabel(); 
    263267 
    264268      isDistributed_ = (!this->begin.isEmpty() && !this->n.isEmpty() && (this->begin + this->n < this->n_glo)) || 
     
    333337  } 
    334338 
     339  void CAxis::checkLabel() 
     340  { 
     341    if (!label.isEmpty()) 
     342    { 
     343      if (label.extent(0) != n) 
     344        ERROR("CAxis::checkLabel(void)", 
     345              << "The label array of the axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] must be of dimension of axis size." << std::endl 
     346              << "Axis size is " << n.getValue() << "." << std::endl 
     347              << "label size is "<< label.extent(0)<<  " ."); 
     348      hasLabel = true; 
     349    } 
     350    else hasLabel = false; 
     351  } 
    335352  void CAxis::checkEligibilityForCompressedOutput() 
    336353  { 
     
    657674    list<CArray<double,1> > list_val; 
    658675    list<CArray<double,2> > list_bounds; 
     676    list<CArray<StdString,1> > list_label; 
    659677 
    660678    std::map<int, std::vector<size_t> >::const_iterator it, iteMap; 
     
    675693        list_bounds.push_back(CArray<double,2>(2,nbData)); 
    676694      } 
     695       
     696      if (hasLabel) 
     697      { 
     698        list_label.push_back(CArray<StdString,1>(nbData)); 
     699      } 
    677700 
    678701      CArray<int,1>& indi = list_indi.back(); 
     
    693716          boundsVal(1, n) = bounds(1,n); 
    694717        } 
     718         
     719        if (hasLabel) 
     720        { 
     721          CArray<StdString,1>& labelVal = list_label.back(); 
     722          labelVal(n) = label(n); 
     723        } 
    695724      } 
    696725 
     
    716745      { 
    717746        list_msgsVal.back() << list_bounds.back(); 
     747      } 
     748  
     749      if (hasLabel) 
     750      { 
     751        list_msgsVal.back() << list_label.back(); 
    718752      } 
    719753 
     
    783817    CArray<double,1> val; 
    784818    CArray<double,2> boundsVal; 
     819    CArray<StdString,1> labelVal; 
    785820 
    786821    buffer >> val; 
    787822    if (hasBounds_) buffer >> boundsVal; 
     823    if (hasLabel) buffer >> labelVal; 
    788824 
    789825    int i, j, ind_srv; 
     
    798834        bound_srv(1,ind_srv) = boundsVal(1, ind); 
    799835      } 
     836 
     837      if (hasLabel) 
     838      { 
     839        label_srv(ind_srv) = labelVal( ind); 
     840      } 
     841 
    800842    } 
    801843  } 
     
    836878        bound_srv(0,ind) = bounds(0,ind); 
    837879        bound_srv(1,ind) = bounds(1,ind); 
     880      } 
     881      if (hasLabel) 
     882      { 
     883        label_srv(ind) = label(ind); 
    838884      } 
    839885    } 
     
    927973      value_srv.resize(zoom_size_srv); 
    928974      if (hasBounds_)  bound_srv.resize(2,zoom_size_srv); 
     975      if (hasLabel)  label_srv.resize(zoom_size_srv); 
    929976    } 
    930977  } 
  • XIOS/trunk/src/node/axis.hpp

    r927 r1050  
    123123        CArray<double,1> value_srv; 
    124124        CArray<double,2> bound_srv; 
     125        CArray<StdString,1> label_srv; 
    125126        bool hasValue; 
    126127 
     
    130131         void checkZoom(); 
    131132         void checkBounds(); 
     133         void checkLabel(); 
    132134         void checkTransformations(); 
    133135         void sendValue(); 
     
    163165         std::map<int, CArray<int,1> > indiSrv_; 
    164166         bool hasBounds_; 
     167         bool hasLabel; 
    165168 
    166169       private: 
Note: See TracChangeset for help on using the changeset viewer.