00001 #ifndef __MARK_HPP__
00002 #define __MARK_HPP__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef __cplusplus
00035 #error Must use C++ compiler
00036 #endif
00037
00038
00039
00040 #include <stdio.h>
00041 #include "string.hpp"
00042 #include "listt.hpp"
00043
00044
00045
00046 class Mark1D {
00047 private:
00048 static int cmp(LONG a,LONG b) {if (a>b) return 1; if (a<b) return -1; return 0;}
00049 public:
00050 LONG pos;
00051 LONG span;
00052 String label;
00053
00054 Mark1D (VOID) {};
00055 Mark1D (const Mark1D& d) : pos(d.pos), span(d.span), label(d.label) {}
00056 Mark1D (LONG posx, String labelx="") : pos(posx), span(0), label(labelx) {}
00057 Mark1D (LONG posx, LONG spanx, String labelx="") : pos(posx), span(spanx), label(labelx) {}
00058
00059 Mark1D& operator = (const Mark1D& m) { pos=m.pos; span=m.span; label=m.label; return *this; }
00060
00061 static int compare_p( const Mark1D&a, const Mark1D& b) { return cmp(a.pos,b.pos); }
00062 static int compare_s( const Mark1D&a, const Mark1D& b) { return cmp(a.span,b.span); }
00063 static int compare_l( const Mark1D&a, const Mark1D& b) { return compare(a.label,b.label); }
00064 static int compare_ps( const Mark1D&a, const Mark1D& b) { int c=compare_p(a,b); return c?c:compare_s(a,b); }
00065 static int compare_pl( const Mark1D&a, const Mark1D& b) { int c=compare_p(a,b); return c?c:compare_l(a,b); }
00066 static int compare_sl( const Mark1D&a, const Mark1D& b) { int c=compare_s(a,b); return c?c:compare_l(a,b); }
00067 static int compare_psl( const Mark1D&a, const Mark1D& b) { int c=compare_p(a,b); return c?c:compare_sl(a,b); }
00068 int operator == (const Mark1D& m) { return compare_psl(*this,m); }
00069 };
00070
00071
00072
00073 class Mark1DList {
00074 ListT<Mark1D> l;
00075 DOUBLE srate;
00076 public:
00077 Mark1DList(VOID) {srate=128000.;}
00078 Mark1DList(const Mark1DList& a) { l=a.l; srate=a.srate; }
00079 Mark1DList& operator = (const Mark1DList& a) { l=a.l; srate=a.srate; return *this; }
00080 virtual ~Mark1DList() { }
00081
00082 VOID setSRate(DOUBLE sr) { srate=sr; }
00083 DOUBLE getSRate(VOID) { return srate; }
00084 VOID adjustSRate(DOUBLE sr);
00085
00086 BOOL OK(VOID) const;
00087 BOOL empty(VOID) const {return l.empty();}
00088 LONG length(VOID) const {return l.length();}
00089 VOID clear(VOID) {l.clear();}
00090 Lix first() const {return l.first();}
00091 Lix last() const {return l.last();}
00092 Lix prev(Lix p) const {return l.prev(p);}
00093 Lix next(Lix p) const {return l.next(p);}
00094 BOOL owns(Lix p) const {return l.owns(p);}
00095 LONG index(Lix p) const {return l.index(p);}
00096 Lix lix(LONG i) const {return l.lix(i);}
00097 VOID reverse(VOID) {l.reverse();}
00098
00099 public:
00100 Lix insbefore(Lix p, const Mark1D &m) {return l.insbefore(p,m);}
00101 Lix insafter(Lix p, const Mark1D &m) {return l.insafter(p,m);}
00102 Lix prepend(const Mark1D &m) {return l.prepend(m);}
00103 Lix append(const Mark1D &m) {return l.append(m);}
00104 Lix insbefore(Lix p, const Mark1DList &a) {return l.insbefore(p,a.l);}
00105 Lix insafter(Lix p, const Mark1DList &a) {return l.insafter(p,a.l);}
00106 Lix prepend(const Mark1DList &a) {return l.prepend(a.l);}
00107 Lix append(const Mark1DList &a) {return l.append(a.l);}
00108 Lix insbefore_mv(Lix p, Mark1DList &a) {return l.insbefore_mv(p,a.l);}
00109 Lix insafter_mv(Lix p, Mark1DList &a) {return l.insafter_mv(p,a.l);}
00110 Lix prepend_mv(Mark1DList &a) {return l.prepend_mv(a.l);}
00111 Lix append_mv(Mark1DList &a) {return l.append_mv(a.l);}
00112 Lix insbefore(Lix p, LONG pos, const String &label="");
00113 Lix insafter(Lix p, LONG pos, const String &label="");
00114 Lix prepend(LONG pos, const String &label="");
00115 Lix append(LONG pos, const String &label="");
00116 Lix insbefore(Lix p, LONG pos, LONG span, const String &label="");
00117 Lix insafter(Lix p, LONG pos, LONG span, const String &label="");
00118 Lix prepend(LONG pos, LONG span, const String &label="");
00119 Lix append(LONG pos, LONG span, const String &label="");
00120
00121 Lix seek_p(LONG pos, Lix from=0) const;
00122 Lix seek_s(LONG span, Lix from=0) const;
00123 Lix seek_l(String label, Lix from=0) const;
00124 Lix seek_ps(LONG pos, LONG span, Lix from=0) const;
00125 Lix seek_pl(LONG pos, String label, Lix from=0) const;
00126 Lix seek_sl(LONG span, String label, Lix from=0) const;
00127 Lix seek_psl(LONG pos, LONG span, String label, Lix from=0) const;
00128 Lix seek_p(const Mark1D& m, Lix from=0) const { return seek_p(m.pos,from); }
00129 Lix seek_s(const Mark1D& m, Lix from=0) const { return seek_s(m.span,from); }
00130 Lix seek_l(const Mark1D& m, Lix from=0) const { return seek_l(m.label,from); }
00131 Lix seek_ps(const Mark1D& m, Lix from=0) const { return seek_ps(m.pos,m.span,from); }
00132 Lix seek_pl(const Mark1D& m, Lix from=0) const { return seek_pl(m.pos,m.label,from); }
00133 Lix seek_sl(const Mark1D& m, Lix from=0) const { return seek_sl(m.span,m.label,from); }
00134 Lix seek_psl(const Mark1D& m, Lix from=0) const { return seek_psl(m.pos,m.span,m.label,from); }
00135
00136 Lix rseek_p(LONG pos, Lix from=0) const;
00137 Lix rseek_s(LONG span, Lix from=0) const;
00138 Lix rseek_l(String label, Lix from=0) const;
00139 Lix rseek_ps(LONG pos, LONG span, Lix from=0) const;
00140 Lix rseek_pl(LONG pos, String label, Lix from=0) const;
00141 Lix rseek_sl(LONG span, String label, Lix from=0) const;
00142 Lix rseek_psl(LONG pos, LONG span, String label, Lix from=0) const;
00143 Lix rseek_p(const Mark1D& m, Lix from=0) const { return rseek_p(m.pos,from); }
00144 Lix rseek_s(const Mark1D& m, Lix from=0) const { return rseek_s(m.span,from); }
00145 Lix rseek_l(const Mark1D& m, Lix from=0) const { return rseek_l(m.label,from); }
00146 Lix rseek_ps(const Mark1D& m, Lix from=0) const { return rseek_ps(m.pos,m.span,from); }
00147 Lix rseek_pl(const Mark1D& m, Lix from=0) const { return rseek_pl(m.pos,m.label,from); }
00148 Lix rseek_sl(const Mark1D& m, Lix from=0) const { return rseek_sl(m.span,m.label,from); }
00149 Lix rseek_psl(const Mark1D& m, Lix from=0) const { return rseek_psl(m.pos,m.span,m.label,from); }
00150
00151 VOID uniq_p( VOID );
00152 VOID uniq_s( VOID );
00153 VOID uniq_l( VOID );
00154 VOID uniq_ps( VOID );
00155 VOID uniq_pl( VOID );
00156 VOID uniq_sl( VOID );
00157 VOID uniq_psl( VOID );
00158
00159 Lix del(Lix p, INT dir=1) {return l.del(p,dir);}
00160 VOID delprev(Lix p) {l.delprev(p);}
00161 VOID delnext(Lix p) {l.delnext(p);}
00162 Lix delfirst() {return l.delfirst();}
00163 Lix dellast() {return l.dellast();}
00164
00165 const Mark1D& mark(Lix p) const {return l.item(p);}
00166 const Mark1D& operator () (Lix p) const {return l.item(p);}
00167 Mark1D& mark(Lix p) {return l.item(p);}
00168
00169 const LONG& pos(Lix p) const {return l.item(p).pos;}
00170 LONG& pos(Lix p) {return l.item(p).pos;}
00171 const LONG& span(Lix p) const {return l.item(p).span;}
00172 LONG& span(Lix p) {return l.item(p).span;}
00173 const String& label(Lix p) const {return l.item(p).label;}
00174 String& label(Lix p) {return l.item(p).label;}
00175
00176 VOID exchange( Lix p1, Lix p2 ) {l.exchange(p1,p2);}
00177 VOID sort( BOOL reverse=FALSE );
00178
00179 VOID adjust_scale( DOUBLE k, LONG t0=0 );
00180 VOID adjust_del( LONG pos, LONG n=1 );
00181 VOID adjust_ins( LONG pos, LONG n=1 );
00182 VOID adjust_range( LONG t0, LONG t1 );
00183
00184 Lix insbefore_ms(Lix p, const Mark1D &m, DOUBLE srate);
00185 Lix insafter_ms(Lix p, const Mark1D &m, DOUBLE srate);
00186 Lix prepend_ms(const Mark1D &m, DOUBLE srate);
00187 Lix append_ms(const Mark1D &m, DOUBLE srate);
00188 Lix insbefore_ms(Lix p, const Mark1DList &a);
00189 Lix insafter_ms(Lix p, const Mark1DList &a);
00190 Lix prepend_ms(const Mark1DList &a);
00191 Lix append_ms(const Mark1DList &a);
00192 Lix insbefore_mv_ms(Lix p, Mark1DList &a);
00193 Lix insafter_mv_ms(Lix p, Mark1DList &a);
00194 Lix prepend_mv_ms(Mark1DList &a);
00195 Lix append_mv_ms(Mark1DList &a);
00196 Lix insbefore_ms(Lix p, DOUBLE posms, const String &label="");
00197 Lix insafter_ms(Lix p, DOUBLE posms, const String &label="");
00198 Lix prepend_ms(DOUBLE posms, const String &label="");
00199 Lix append_ms(DOUBLE posms, const String &label="");
00200 Lix insbefore_ms(Lix p, DOUBLE posms, DOUBLE spanms, const String &label="");
00201 Lix insafter_ms(Lix p, DOUBLE posms, DOUBLE spanms, const String &label="");
00202 Lix prepend_ms(DOUBLE posms, DOUBLE spanms, const String &label="");
00203 Lix append_ms(DOUBLE posms, DOUBLE spanms, const String &label="");
00204
00205 Lix seek_p_ms(DOUBLE posms, Lix from=0) const;
00206 Lix seek_s_ms(DOUBLE spanms, Lix from=0) const;
00207 Lix seek_ps_ms(DOUBLE posms, DOUBLE spanms, Lix from=0) const;
00208 Lix seek_pl_ms(DOUBLE posms, String label, Lix from=0) const;
00209 Lix seek_sl_ms(DOUBLE spanms, String label, Lix from=0) const;
00210 Lix seek_psl_ms(DOUBLE posms, DOUBLE spanms, String label, Lix from=0) const;
00211 Lix seek_p_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00212 Lix seek_s_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00213 Lix seek_ps_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00214 Lix seek_pl_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00215 Lix seek_sl_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00216 Lix seek_psl_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00217
00218 Lix rseek_p_ms(DOUBLE posms, Lix from=0) const;
00219 Lix rseek_s_ms(DOUBLE spanms, Lix from=0) const;
00220 Lix rseek_ps_ms(DOUBLE posms, DOUBLE spanms, Lix from=0) const;
00221 Lix rseek_pl_ms(DOUBLE posms, String label, Lix from=0) const;
00222 Lix rseek_sl_ms(DOUBLE spanms, String label, Lix from=0) const;
00223 Lix rseek_psl_ms(DOUBLE posms, DOUBLE spanms, String label, Lix from=0) const;
00224 Lix rseek_p_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00225 Lix rseek_s_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00226 Lix rseek_ps_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00227 Lix rseek_pl_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00228 Lix rseek_sl_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00229 Lix rseek_psl_ms(const Mark1D& m, DOUBLE sr, Lix from=0) const;
00230
00231 DOUBLE getpos_ms( Lix p) const;
00232 VOID setpos_ms(Lix p, DOUBLE pos_ms);
00233 DOUBLE getspan_ms(Lix p) const;
00234 VOID setspan_ms(Lix p, DOUBLE span_ms);
00235
00236 VOID adjust_scale_ms( DOUBLE k, DOUBLE t0_ms=0 );
00237 VOID adjust_del_ms( DOUBLE pos_ms, DOUBLE n_ms=1 );
00238 VOID adjust_ins_ms( DOUBLE pos_ms, DOUBLE n_ms=1 );
00239 VOID adjust_range_ms( DOUBLE t0_ms, DOUBLE t1_ms );
00240
00241
00242 const Mark1D& mark(LIINT i) const {return l.item(i);}
00243 const Mark1D& operator () (LIINT i) const {return l.item(i);}
00244 Mark1D& mark(LIINT i) {return l.item(i);}
00245
00246 const LONG& pos(LIINT i) const {return l.item(i).pos;}
00247 LONG& pos(LIINT i) {return l.item(i).pos;}
00248 const LONG& span(LIINT i) const {return l.item(i).span;}
00249 LONG& span(LIINT i) {return l.item(i).span;}
00250 const String& label(LIINT i) const {return l.item(i).label;}
00251 String& label(LIINT i) {return l.item(i).label;}
00252 VOID exchange( LIINT i1, LIINT i2 ) {l.exchange(i1,i2);}
00253 DOUBLE getpos_ms(LIINT i) const;
00254 VOID setpos_ms(LIINT i, DOUBLE pos_ms);
00255 DOUBLE getspan_ms(LIINT i) const;
00256 VOID setspan_ms(LIINT i, DOUBLE span_ms);
00257
00258 BOOL foutput( FILE *f, BOOL indent, BOOL rangespan, BOOL ms );
00259 VOID finput( FILE* f, BOOL ms, const CHAR *fileName, LONG &line, CHAR*buf, INT buflen, INT eofch );
00260
00261 BOOL foutput( FILE *f, BOOL rangespan=FALSE ) { return foutput(f,FALSE,rangespan,FALSE); }
00262 BOOL foutput_ms( FILE *f, BOOL rangespan=FALSE ) { return foutput(f,FALSE,rangespan,TRUE); }
00263 VOID finput( FILE* f, BOOL ms=FALSE );
00264 VOID finput_ms( FILE *f ) { finput(f,TRUE); }
00265 };
00266
00267
00268
00269 #endif
00270