Changeset 0cc72d6 in tol


Ignore:
Timestamp:
Nov 17, 2010, 7:39:37 PM (16 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
d06ddf9
Parents:
04855da
Message:

Fixed #1011
Remove and Replace must update the index by name if exists

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@2686 be4846ae-f051-483a-831f-b64e7d08527f

Location:
tol/btol/set_type
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/set_type/set.cpp

    r04855da r0cc72d6  
    3939BSyntaxObject* BSet::objCond_   = NIL;
    4040BSet             BSet::unknown_;
     41
     42//--------------------------------------------------------------------
     43static bool DoIndexElement(BObjByIdxNameHash** indexByName,
     44                           BSyntaxObject* obj,
     45                           int i)
     46//--------------------------------------------------------------------
     47{
     48  bool ok = true;
     49  if(indexByName && *indexByName && obj)
     50  {
     51    const BText& name = obj->Name();
     52    if(name.HasName())
     53    {
     54      BObjByIdxNameHash::const_iterator found = (*indexByName)->find(name);
     55      if(found!=(*indexByName)->end())
     56      {
     57        Error(I2("Duplicated index name ",
     58                 "Nombre de índice duplicado ")+
     59              name);
     60        ok = false;
     61      }
     62      (**indexByName)[name] = BIndexedSyntaxObject(i,obj);
     63    }
     64    else
     65    {
     66      Error(I2("A indexed by name set cannot have elements without a valid name ",
     67               "Un conjunto indexado por nombres no puede tener elementos sin un nombre válido ")
     68            +"'"+name+"'");
     69      ok = false;
     70    }
     71   if(!ok) { delete *indexByName; *indexByName = NULL; }
     72  }
     73  return(ok);
     74}
     75
     76//--------------------------------------------------------------------
     77static bool UnIndexElement(BObjByIdxNameHash** indexByName,
     78                           BSyntaxObject* obj)
     79//--------------------------------------------------------------------
     80{
     81  bool ok = true;
     82  if(indexByName && *indexByName && obj)
     83  {
     84    const BText& name = obj->Name();
     85    if(name.HasName())
     86    {
     87      BObjByIdxNameHash::const_iterator found = (*indexByName)->find(name);
     88      if(found!=(*indexByName)->end())
     89      {
     90        (*indexByName)->erase(name);
     91      }
     92      else
     93      {
     94        Error(I2("Cannot remove the non found index name ",
     95                 "No se puede eliminar el índice de nombre no encontrado ")+
     96              name);
     97        ok = false;
     98      }
     99    }
     100    if(!ok) { delete *indexByName; *indexByName = NULL; }
     101  }
     102  return(ok);
     103}
     104
     105//--------------------------------------------------------------------
     106static bool ReIndexElement(BObjByIdxNameHash** indexByName,
     107                           BSyntaxObject* obj,
     108                           int i)
     109//--------------------------------------------------------------------
     110{
     111  bool ok = true;
     112  if(indexByName && *indexByName && obj)
     113  {
     114    const BText& name = obj->Name();
     115    if(name.HasName())
     116    {
     117      BObjByIdxNameHash::iterator found = (*indexByName)->find(name);
     118      if(found!=(*indexByName)->end())
     119      {
     120        found->second.position_ = i;
     121      }
     122      else
     123      {
     124        Error(I2("Cannot remove the non found index name ",
     125                 "No se puede eliminar el índice de nombre no encontrado ")+
     126              name);
     127        ok = false;
     128      }
     129    }
     130    else
     131    {
     132      Error(I2("A indexed by name set cannot have elements without a valid name ",
     133               "Un conjunto indexado por nombres no puede tener elementos sin un nombre válido ")
     134            +"'"+name+"'");
     135      ok = false;
     136    }
     137   if(!ok) { delete *indexByName; *indexByName = NULL; }
     138  }
     139  return(ok);
     140}
     141
    41142
    42143//--------------------------------------------------------------------
    … …  
    334435}
    335436
    336 //--------------------------------------------------------------------
    337 static bool DoIndexElement(BObjByIdxNameHash** indexByName,
    338                            BSyntaxObject* obj,
    339                            int i)
    340 //--------------------------------------------------------------------
    341 {
    342   bool ok = true;
    343   if(indexByName && *indexByName && obj)
    344   {
    345     const BText& name = obj->Name();
    346     if(name.HasName())
    347     {
    348       BObjByIdxNameHash::const_iterator found = (*indexByName)->find(name);
    349       if(found!=(*indexByName)->end())
    350       {
    351         Error(I2("Duplicated index name ",
    352                  "Nombre de ᅵndice duplicado ")+
    353               name);
    354         ok = false;
    355       }
    356       (**indexByName)[name] = BIndexedSyntaxObject(i,obj);
    357     }
    358     else
    359     {
    360       Error(I2("A indexed by name set cannot have elements without a valid name ",
    361                "Un conjunto indexado por nombres no puede tener elementos sin un nombre vᅵlido ")
    362             +"'"+name+"'");
    363       ok = false;
    364     }
    365    if(!ok) { delete *indexByName; *indexByName = NULL; }
    366   }
    367   return(ok);
    368 }
     437
    369438
    370439//--------------------------------------------------------------------
    … …  
    396465  if((n<0)||(n>=s)) { return; }
    397466  BSyntaxObject* found = array_[n];
     467  UnIndexElement(&indexByName_,found);
    398468  int i;
    399469  for(i=n; i<s-1; i++)
    400470  {
    401471    array_[i] = array_[i+1];
     472    ReIndexElement(&indexByName_,array_[i],i);
    402473  }
    403474  array_.ReallocBuffer(s-1);
    … …  
    413484  if((n<0)||(n>=s)) { return; }
    414485  BSyntaxObject* found = array_[n];
     486  UnIndexElement(&indexByName_,found);
    415487  newObject->IncNRefs();
    416488  array_[n] = newObject;
     489  DoIndexElement(&indexByName_,array_[n],n);
    417490  found->DecNRefs();
    418491  if(deleteOld) { DESTROY(found); }
  • tol/btol/set_type/setgra.cpp

    r04855da r0cc72d6  
    161161                  I2("Removes the n-th element of a set and tries to delete it "
    162162         "from memory if deleteOld is true. Returns the own set "
    163          "with the rest of elements."  ,
     163         "with the rest of elements."
     164         "If the set was indexed by name then the indes will be updated.",
    164165               "Elimina el n-esimo elemento de un conjunto e intenta "
    165166         "borrar el viejo de la memoria si deleteOld es cierto. "
    166          "Devuelve el propio conjunto con el resto de elementos."),
     167         "Devuelve el propio conjunto con el resto de elementos."
     168         "Si el conjunto estaba indexado por nombre el índice será "
     169         "actualizado"),
    167170                  BOperClassify::SetAlgebra_
    168171    )
    … …  
    202205                  I2("Replaces the n-th element of a set by a another new one "
    203206         "and tries to delete the old one from memory if deleteOld "
    204          "is true. Returns the own set with the new changed element.",
     207         "is true. Returns the own set with the new changed element."
     208         "If the set was indexed by name then the indes will be updated." ,
    205209               "Reemplaza el n-ésimo elemento de un conjunto por otro "
    206210         "nuevo e intenta borrar el viejo de la memoria si deleteOld "
    207211         "es cierto. Devuelve el propio conjunto con el elemento "
    208          "cambiado."),
     212         "cambiado."
     213         "Si el conjunto estaba indexado por nombre el índice será "
     214         "actualizado"),
    209215                  BOperClassify::SetAlgebra_
    210216    )
Note: See TracChangeset for help on using the changeset viewer.