componentrange.cc 3.95 KB
Newer Older
jcl's avatar
jcl committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
// ============================================================================
// Copyright Jean-Charles LAMBERT - 2008-2010                                       
// e-mail:   Jean-Charles.Lambert@oamp.fr                                      
// address:  Dynamique des galaxies                                            
//           Laboratoire d'Astrophysique de Marseille                          
//           Ple de l'Etoile, site de Chteau-Gombert                         
//           38, rue Frdric Joliot-Curie                                     
//           13388 Marseille cedex 13 France                                   
//           CNRS U.M.R 6110                                                   
// ============================================================================
#include "componentrange.h"
#include <sstream>
#include <iostream>
#include "assert.h"
namespace uns {

// ============================================================================
// constructor                                                                 
ComponentRange::ComponentRange()
{
  n=0;
  position=first=last=-1;
  range="";
  type="";
}
// ============================================================================
// copy constructor                                                            
ComponentRange::ComponentRange(const ComponentRange&m)
{
  n        = m.n;
  first    = m.first;
  last     = m.last;
  range    = m.range;
  type     = m.type;
  position = m.position;
}
// ============================================================================
ComponentRange::~ComponentRange()
{
}
// ============================================================================
void ComponentRange::setData(const int _f, const int _l, const std::string _t)
{
  first=_f;
  last = _l;
  setType(_t);
  computeN();
  buildRange();
}
// ============================================================================
int ComponentRange::computeN()
{
  n=last-first+1;
  return n;
}
// ============================================================================
void ComponentRange::buildRange()
{
  std::ostringstream stm1,stm2;
  stm1 << first;
  stm2 << last;
  range = stm1.str()+":"+stm2.str();
}
// ============================================================================
// getIndexMatchType                                                           
// return the index vector matching the type of object in the component range  
// vector. Return also the object offset in the index tab                      
int ComponentRange::getIndexMatchType(const ComponentRangeVector * crv, const std::string type,
                                      int &offset, bool crvuser)
{
  int status=-1;
  offset=0;
  assert(crv);
  for (unsigned int i=0; i<crv->size()&&status==-1; i++) {
    //std::cerr << "i="<<i<<" crv.type =" <<(*crv)[i].type<<" type="<<type<<"\n"; 
    if ((*crv)[i].type == type)  status=i;
    else {
      if (i>0 || crvuser) { // skip first which match "all" component
                            // or User's crv is processing "no all"
	offset+=(*crv)[i].n;
      }
    }
  }
  return status;
}
// ============================================================================
void ComponentRange::list(const ComponentRangeVector * crv)
{
  std::cerr << "ComponentRange::list size"<<crv->size()<<"\n";
  for (unsigned int i=0; i<crv->size(); i++) {
    std::cerr << "-----------------------------------------------------------\n";
    std::cerr << "Component #"<<i<<"\n";
    std::cerr << "type  :"<<(*crv)[i].type<<"\n";
    std::cerr << "range :"<<(*crv)[i].range<<"\n";
    std::cerr << "nbody :"<<(*crv)[i].n<<"\n";
  }
}
// ============================================================================
int ComponentRange::print(const ComponentRangeVector * crv, std::string select)
{
  for (unsigned int i=0; i<crv->size(); i++) {
    if ((*crv)[i].type == select) return i;
  }
  return -1;
}
} // namespace
// ============================================================================