Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
document last changes
[simgrid.git] / src / nws_portability / Include / fbuff.h
1 /* $Id$ */
2
3 #if !defined(FBUFF_H)
4 #define FBUFF_H
5
6 #define MODMINUS(a,b,m) ((a) - (b) + (((a) >= (b)) ? 0 : ((b) <= (m)) ? (m) : ((m) * (1 + (int)(b) / (int)(m)))))
7 #define MODPLUS(a,b,m)  ((a) + (b) - ((((m) - (b)) > (a)) ? 0 : ((b) <= (m)) ? (m) : ((m) * (1 + (int)(b) / (int)(m)))))
8
9 struct fbuff_stc
10 {
11         int head;
12         int tail;
13         int size;
14         double *vals;
15 };
16
17 typedef struct fbuff_stc *fbuff;
18
19 #define FBUFF_SIZE (sizeof(struct fbuff_stc))
20
21 #define F_HEAD(fb) ((fb)->vals[(fb)->head])
22 #define F_SIZE(fb) ((fb)->size)
23 #define F_FIRST(fb) MODPLUS(((fb)->head),1,(fb)->size)
24 #define F_LAST(fb) ((fb)->head)
25 #define F_VAL(fb,i) ((fb)->vals[(i)])
26 #define F_COUNT(fb) (MODMINUS((fb)->tail,(fb)->head,(fb)->size) - 1)
27 #define F_TAIL(fb) ((fb)->tail)
28
29 #define IS_EMPTY(fb) ((F_COUNT(fb) == 0) ? 1 : 0) 
30
31 extern fbuff InitFBuff(int size);
32 extern void FreeFBuff(fbuff fb);
33 extern void UpdateFBuff(fbuff fb, double val);
34
35 #endif