예제 #1
0
AttrRef addFloatAttr(AttrTable &self, const std::string &attrName, 
                     const size_t size, boost::python::list l)
{
  std::vector<float> defaults = pyListValues<float>(l);
  return self.addFloatAttr(attrName, size, defaults);
}
예제 #2
0
int main()
{
  size_t numItems = 10000000;

  AttrTable at;
  at.addVectorAttr("P", V3f(0.0));
  at.addFloatAttr("float_attr", 1, std::vector<float>(1, 0.0));
  at.addIntAttr("int_attr", 1, std::vector<int>(1, 0));
  at.resize(numItems);
  
  // First we iterate explicitly over all points
  
  {
    boost::timer::auto_cpu_timer timer;
    
    AttrRef pRef = at.vectorAttrRef("P");
    AttrRef floatRef = at.floatAttrRef("float_attr");
    AttrRef intRef = at.intAttrRef("int_attr");

    V3f pVal(0.0);
    float floatVal(0.0);
    int intVal(0);

    for (size_t i = 0, end = at.size(); i != end; ++i) {
      pVal += at.vectorAttr(pRef, i);
      floatVal += at.floatAttr(floatRef, i, 0);
      intVal += at.intAttr(intRef, i, 0);
    }

	timer.stop();
    cout << "Time to iterate explicitly: ";
	timer.report();

  }

  // Then, we introduce a global attribute map
  
  ParamMap params;
  params.intMap["int_attr"] = 1;
  params.floatMap["float_attr"] = 1.0;
  params.intMap["int_attr_2"] = 1;
  params.floatMap["float_attr_2"] = 1.0;

  {
	  boost::timer::auto_cpu_timer timer;

    AttrRef pRef = at.vectorAttrRef("P");
    AttrRef floatRef = at.floatAttrRef("float_attr");
    AttrRef intRef = at.intAttrRef("int_attr");
    AttrRef floatRef2 = at.floatAttrRef("float_attr_2");
    AttrRef intRef2 = at.intAttrRef("int_attr_2");

    V3f pVal(0.0);
    float floatVal(0.0), floatVal2(0.0);
    int intVal(0), intVal2(0);

    if (pRef.isValid()) {
        for (size_t i = 0, end = at.size(); i != end; ++i) {
          pVal += at.vectorAttr(pRef, i);
        }
    } else {
      pVal += params.vectorMap["P"] * at.size();
    }
    if (floatRef.isValid()) {
      for (size_t i = 0, end = at.size(); i != end; ++i) {
        floatVal += at.floatAttr(floatRef, i, 0);
      } 
    } else {
      floatVal += params.floatMap["float_attr"] * at.size();
    }
    if (intRef.isValid()) {
      for (size_t i = 0, end = at.size(); i != end; ++i) {
        intVal += at.intAttr(intRef, i, 0);
      }
    } else {
      intVal += params.intMap["int_attr"] * at.size();
    }
    if (floatRef2.isValid()) {
      for (size_t i = 0, end = at.size(); i != end; ++i) {
        floatVal2 += at.floatAttr(floatRef2, i, 0);
      }
    } else {
      floatVal2 += params.floatMap["float_attr_2"] * at.size();
    }
    if (intRef2.isValid()) {
      for (size_t i = 0, end = at.size(); i != end; ++i) {
        intVal2 += at.intAttr(intRef2, i, 0);
      }
    } else {
      intVal2 += params.intMap["int_attr_2"] * at.size();
    }
	timer.stop();
    cout << "Time to iterate explicitly with param map: ";
	timer.report();
    cout << pVal << " " << floatVal << " " << floatVal2 << " "
         << intVal << " " << intVal2 << endl;
    
  }

  // Lastly, we iterate using AttrVisitor

  {

	boost::timer::auto_cpu_timer timer;

    AttrVisitor visitor(at, params);
    Attr<V3f> p("P");
    Attr<float> float1("float_attr");
    Attr<float> float2("float_attr_2");
    Attr<int> int1("int_attr");
    Attr<int> int2("int_attr_2");

    V3f pVal(0.0);
    float floatVal(0.0), floatVal2(0.0);
    int intVal(0), intVal2(0);

    for (AttrVisitor::const_iterator i = visitor.begin(), end = visitor.end();
         i != end; ++i) {
      i.update(p);
      i.update(float1);
      i.update(float2);
      i.update(int1);
      i.update(int2);
      pVal += p.value();
      floatVal += float1.value();
      floatVal2 += float2.value();
      intVal += int1.value();
      intVal2 += int2.value();
    }
	timer.stop();
    cout << "Time to iterate using AttrVisitor: ";
	timer.report();
    cout << pVal << " " << floatVal << " " << floatVal2 << " "
         << intVal << " " << intVal2 << endl;
    
  }

}