/usr/include/choreonoid-1.1/cnoid/src/Util/MultiSeq.h is in libcnoid-dev 1.1.0+dfsg-6.1+b4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | /**
@file
@author Shin'ichiro Nakaoka
*/
#ifndef CNOID_UTIL_MULTI_SEQ_H_INCLUDED
#define CNOID_UTIL_MULTI_SEQ_H_INCLUDED
#include "SeqBase.h"
#include <algorithm>
#include <boost/multi_array.hpp>
namespace cnoid {
template <typename ElementType, typename Allocator = std::allocator<ElementType> >
class MultiSeq : public MultiSeqBase
{
public:
typedef boost::shared_ptr< MultiSeq<ElementType, Allocator> > Ptr;
typedef typename boost::multi_array<ElementType, 2, Allocator> Container;
typedef typename Container::index_range IndexRange;
typedef typename Container::template array_view<1>::type View;
MultiSeq(const char* seqType, int numParts = 1, int numFrames = 0.0, double frameRate = 100.0)
: MultiSeqBase(seqType),
container(boost::extents[numFrames][numParts]) {
frameRate_ = frameRate;
numFrames_ = numFrames;
}
MultiSeq(const MultiSeq<ElementType, Allocator>& org)
: MultiSeqBase(org),
container(org.container) {
frameRate_ = org.frameRate_;
numFrames_ = org.numFrames_;
}
virtual ~MultiSeq() { }
virtual void setDimension(int newNumFrames, int newNumParts, bool clearNewElements = false) {
const int prevNumParts = numParts();
const int prevNumFrames = numFrames();
int reservedNumFrames = container.size();
if(newNumFrames > reservedNumFrames){
container.resize(boost::extents[newNumFrames][newNumParts]);
} else {
container.resize(boost::extents[reservedNumFrames][newNumParts]);
}
numFrames_ = newNumFrames;
if(clearNewElements){
int i = (prevNumFrames == 0) ? 0 : prevNumParts;
while(i < newNumParts){
View frames = part(i++);
std::fill(frames.begin(), frames.end(), defaultValue());
}
if(prevNumFrames > 0 && (numFrames_ > prevNumFrames)){
for(int i=0; i < prevNumParts; ++i){
View frames = part(i);
const ElementType& last = frames[prevNumFrames - 1];
std::fill(frames.begin() + prevNumFrames, frames.end(), last);
}
}
}
}
virtual double getFrameRate() const {
return frameRate_;
}
inline double frameRate() const {
return frameRate_;
}
virtual void setFrameRate(double frameRate) {
frameRate_ = frameRate;
}
virtual void setNumParts(int newNumParts, bool clearNewElements = false) {
setDimension(numFrames(), newNumParts, clearNewElements);
}
virtual int getNumFrames() const {
return numFrames_;
}
inline int numFrames() const {
return numFrames_;
}
virtual void setNumFrames(int newNumFrames, bool clearNewElements = false) {
setDimension(newNumFrames, numParts(), clearNewElements);
}
virtual int getNumParts() const {
return container.shape()[1];
}
inline int numParts() const {
return container.shape()[1];
}
/**
@if jp
シーケンスの時間長を返す。
@note この時間 *未満* の時間については有効なデータが存在する。
この時間のデータは存在しないので、そのようなアクセスしてはいけない。
@endif
*/
inline double timeLength() const {
return numFrames_ / frameRate();
}
inline int frameOfTime(double time) const {
return (int)(time * frameRate_);
}
inline double timeOfFrame(int frame) const {
return (frame / frameRate_);
}
inline const ElementType& at(int frame, int part) const {
return container[frame][part];
}
inline ElementType& at(int frame, int part) {
return container[frame][part];
}
inline View part(int index) {
return container[boost::indices[IndexRange(0, numFrames())][index]];
}
inline View frame(int index) {
return container[index][boost::indices[IndexRange(0, numParts())]];
}
/*
Container::reference operator[](index i) {
return container[i];
}
Container::const_reference operator[](index i) const {
return container[i];
}
*/
inline View appendFrame() {
const size_t n = numFrames_;
if(n >= container.size()){
setNumFrames(n * 2);
}
numFrames_ = n + 1;
return frame(n);
}
template <typename ArrayType> inline void appendFrame(const ArrayType& v) {
View frame = appendFrame();
const int m = numParts();
for(int i=0; i < m; ++i){
frame[i] = v[i];
}
}
virtual bool read(const YamlMapping& archive) { return MultiSeqBase::read(archive); }
virtual bool write(YamlWriter& writer) { return MultiSeqBase::write(writer); }
protected:
Container container;
int numFrames_;
double frameRate_;
virtual ElementType defaultValue() const { return ElementType(); }
};
}
#endif
|