Choreonoid  1.1
MultiSeq.h
[詳解]
1 
6 #ifndef CNOID_UTIL_MULTI_SEQ_H_INCLUDED
7 #define CNOID_UTIL_MULTI_SEQ_H_INCLUDED
8 
9 #include "SeqBase.h"
10 #include <algorithm>
11 #include <boost/multi_array.hpp>
12 
13 namespace cnoid {
14 
15  template <typename ElementType, typename Allocator = std::allocator<ElementType> >
16  class MultiSeq : public MultiSeqBase
17  {
18  public:
19  typedef boost::shared_ptr< MultiSeq<ElementType, Allocator> > Ptr;
20  typedef typename boost::multi_array<ElementType, 2, Allocator> Container;
21  typedef typename Container::index_range IndexRange;
22  typedef typename Container::template array_view<1>::type View;
23 
24 
25  MultiSeq(const char* seqType, int numParts = 1, int numFrames = 0.0, double frameRate = 100.0)
26  : MultiSeqBase(seqType),
27  container(boost::extents[numFrames][numParts]) {
30  }
31 
33  : MultiSeqBase(org),
34  container(org.container) {
35  frameRate_ = org.frameRate_;
36  numFrames_ = org.numFrames_;
37  }
38 
39  virtual ~MultiSeq() { }
40 
41  virtual void setDimension(int newNumFrames, int newNumParts, bool clearNewElements = false) {
42 
43  const int prevNumParts = numParts();
44  const int prevNumFrames = numFrames();
45 
46  int reservedNumFrames = container.size();
47  if(newNumFrames > reservedNumFrames){
48  container.resize(boost::extents[newNumFrames][newNumParts]);
49  } else {
50  container.resize(boost::extents[reservedNumFrames][newNumParts]);
51  }
52 
53  numFrames_ = newNumFrames;
54 
55  if(clearNewElements){
56  int i = (prevNumFrames == 0) ? 0 : prevNumParts;
57  while(i < newNumParts){
58  View frames = part(i++);
59  std::fill(frames.begin(), frames.end(), defaultValue());
60  }
61  if(prevNumFrames > 0 && (numFrames_ > prevNumFrames)){
62  for(int i=0; i < prevNumParts; ++i){
63  View frames = part(i);
64  const ElementType& last = frames[prevNumFrames - 1];
65  std::fill(frames.begin() + prevNumFrames, frames.end(), last);
66  }
67  }
68  }
69  }
70 
71  virtual double getFrameRate() const {
72  return frameRate_;
73  }
74 
75  inline double frameRate() const {
76  return frameRate_;
77  }
78 
79  virtual void setFrameRate(double frameRate) {
81  }
82 
83  virtual void setNumParts(int newNumParts, bool clearNewElements = false) {
84  setDimension(numFrames(), newNumParts, clearNewElements);
85  }
86 
87  virtual int getNumFrames() const {
88  return numFrames_;
89  }
90 
91  inline int numFrames() const {
92  return numFrames_;
93  }
94 
95  virtual void setNumFrames(int newNumFrames, bool clearNewElements = false) {
96  setDimension(newNumFrames, numParts(), clearNewElements);
97  }
98 
99  virtual int getNumParts() const {
100  return container.shape()[1];
101  }
102 
103  inline int numParts() const {
104  return container.shape()[1];
105  }
106 
114  inline double timeLength() const {
115  return numFrames_ / frameRate();
116  }
117 
118  inline int frameOfTime(double time) const {
119  return (int)(time * frameRate_);
120  }
121 
122  inline double timeOfFrame(int frame) const {
123  return (frame / frameRate_);
124  }
125 
126  inline const ElementType& at(int frame, int part) const {
127  return container[frame][part];
128  }
129 
130  inline ElementType& at(int frame, int part) {
131  return container[frame][part];
132  }
133 
134  inline View part(int index) {
135  return container[boost::indices[IndexRange(0, numFrames())][index]];
136  }
137 
138  inline View frame(int index) {
139  return container[index][boost::indices[IndexRange(0, numParts())]];
140  }
141 
142  /*
143  Container::reference operator[](index i) {
144  return container[i];
145  }
146  Container::const_reference operator[](index i) const {
147  return container[i];
148  }
149  */
150 
151  inline View appendFrame() {
152  const size_t n = numFrames_;
153  if(n >= container.size()){
154  setNumFrames(n * 2);
155  }
156  numFrames_ = n + 1;
157  return frame(n);
158  }
159 
160  template <typename ArrayType> inline void appendFrame(const ArrayType& v) {
161  View frame = appendFrame();
162  const int m = numParts();
163  for(int i=0; i < m; ++i){
164  frame[i] = v[i];
165  }
166  }
167 
168  virtual bool read(const YamlMapping& archive) { return MultiSeqBase::read(archive); }
169  virtual bool write(YamlWriter& writer) { return MultiSeqBase::write(writer); }
170 
171  protected:
172 
173  Container container;
175  double frameRate_;
176 
177  virtual ElementType defaultValue() const { return ElementType(); }
178  };
179 }
180 
181 #endif
Definition: YamlWriter.h:18
int numFrames_
Definition: MultiSeq.h:174
int numFrames() const
Definition: MultiSeq.h:91
Container::template array_view< 1 >::type View
Definition: MultiSeq.h:22
ElementType & at(int frame, int part)
Definition: MultiSeq.h:130
virtual ~MultiSeq()
Definition: MultiSeq.h:39
virtual void setNumFrames(int newNumFrames, bool clearNewElements=false)
Definition: MultiSeq.h:95
int numParts() const
Definition: MultiSeq.h:103
virtual ElementType defaultValue() const
Definition: MultiSeq.h:177
virtual double getFrameRate() const
Definition: MultiSeq.h:71
virtual bool read(const YamlMapping &archive)
Definition: MultiSeq.h:168
int frameOfTime(double time) const
Definition: MultiSeq.h:118
double timeOfFrame(int frame) const
Definition: MultiSeq.h:122
const std::string & seqType() const
Definition: SeqBase.h:28
MultiSeq(const MultiSeq< ElementType, Allocator > &org)
Definition: MultiSeq.h:32
Container::index_range IndexRange
Definition: MultiSeq.h:21
boost::shared_ptr< MultiSeq< ElementType, Allocator > > Ptr
Definition: MultiSeq.h:19
const ElementType & at(int frame, int part) const
Definition: MultiSeq.h:126
virtual void setNumParts(int newNumParts, bool clearNewElements=false)
Definition: MultiSeq.h:83
double frameRate() const
Definition: MultiSeq.h:75
Container container
Definition: MultiSeq.h:173
double frameRate_
Definition: MultiSeq.h:175
virtual int getNumParts() const
Definition: MultiSeq.h:99
virtual bool write(YamlWriter &writer)
Definition: MultiSeq.h:169
View frame(int index)
Definition: MultiSeq.h:138
Definition: EasyScanner.h:16
Definition: MultiSeq.h:16
virtual bool write(YamlWriter &writer)
Definition: SeqBase.cpp:64
virtual void setFrameRate(double frameRate)
Definition: MultiSeq.h:79
Definition: YamlNodes.h:212
Definition: SeqBase.h:90
virtual int getNumFrames() const
Definition: MultiSeq.h:87
virtual void setDimension(int newNumFrames, int newNumParts, bool clearNewElements=false)
Definition: MultiSeq.h:41
boost::multi_array< ElementType, 2, Allocator > Container
Definition: MultiSeq.h:20
virtual bool read(const YamlMapping &archive)
Definition: SeqBase.cpp:56
View appendFrame()
Definition: MultiSeq.h:151
MultiSeq(const char *seqType, int numParts=1, int numFrames=0.0, double frameRate=100.0)
Definition: MultiSeq.h:25
View part(int index)
Definition: MultiSeq.h:134
void appendFrame(const ArrayType &v)
Definition: MultiSeq.h:160
double timeLength() const
Definition: MultiSeq.h:114