00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#ifndef MNLCRTPRANGELIST_H
00025
#define MNLCRTPRANGELIST_H
00026
00027
00028
00029
00030
00031
00032
00033
#include <stdlib.h>
00034
#include <unistd.h>
00035
#include <sys/time.h>
00036
#include "mnstream.h"
00037
#include "var_type.h"
00038
#include "MNMsg.h"
00039
#include "MNList.h"
00040
00041
struct LossRange_t;
00042
00043 class LossRange_tList
00044 :
private MNList<LossRange_t*>
00045 {
00046
public:
00047 void*
first() {
00048
return MNList<LossRange_t*>::first();
00049 }
00050
00051 void next(
void*& pix ) {
00052 pix =
MNList<LossRange_t*>::succ(pix);
00053 }
00054
00055 void prev(
void*& pix ) {
00056 pix =
MNList<LossRange_t*>::pred(pix);
00057 }
00058
00059 LossRange_t*
operator()(
void* pix ) {
00060
return MNList<LossRange_t*>::inf(pix);
00061 }
00062
00063 void append(
LossRange_t* p ) {
00064
MNList<LossRange_t*>::push_back ( p );
00065 }
00066
00067 void clear() {
00068
MNList<LossRange_t*>::clear();
00069 }
00070
00071 void del(
void* pix ) {
00072
MNList<LossRange_t*>::del_item(pix);
00073 }
00074
00075 void ins_after(
void* pix,
LossRange_t *n ) {
00076
MNList<LossRange_t*>::ins_after(pix,n);
00077 }
00078
00079 void ins_before(
void* pix,
LossRange_t *n ) {
00080
MNList<LossRange_t*>::ins_before(pix,n);
00081 }
00082 };
00083
00084
00085
00086
00087
00088
00089 struct LossRange_t
00090 {
00091 u_int64 range_begin;
00092 u_int64 range_end;
00093 u_int32 counter;
00094 };
00095
00096 class MNLCRTPRangeList
00097 {
00098
private:
00099
00100
LossRange_tList data;
00101
typedef void* Pix;
00102
00103
00104
bool merge;
00105
bool range_in_order;
00106
00107
00108
00109
00110
void clr();
00111
bool overlapps(Pix elem,
u_int64 begin_r,
u_int64 end_r);
00112 Pix get_place(
u_int64 begin_r,
u_int64 end_r);
00113
00114
public:
00115
MNLCRTPRangeList();
00116
~MNLCRTPRangeList();
00117
00118
00119
void insert_data(
u_int64 begin_r,
u_int64 end_r);
00120
void insert_data_or_increment_counter(
u_int64 begin_r,
u_int64 end_r);
00121
00122
00123
void delete_all();
00124
void delete_range(
u_int64 begin_r,
u_int64 end_r);
00125
00126
00127
void disable_merge();
00128
void enable_merge();
00129
void disable_in_order();
00130
void enable_in_order();
00131
bool range_exists(
u_int64 begin_r);
00132
LossRange_t*
get_first_data();
00133
LossRange_t*
get_next_data(
u_int64 begin_r);
00134
LossRange_t*
get_next_in_range_data(
u_int64 begin_r);
00135
int get_counter(
u_int64 begin_r);
00136
LossRange_t*
get_worst_counter_data();
00137 };
00138
00139
#endif
00140