]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - fres/contract/fres_contract.h
Merge branch 'master' of rtime.felk.cvut.cz:/var/git/frescor/frsh_forb.git
[frescor/frsh.git] / fres / contract / fres_contract.h
1 /**
2  * @file   fres_contract.h
3  * @author Michal Sojka <sojkam1@fel.cvut.cz>
4  * @date   Sun Nov  9 22:15:09 2008
5  * 
6  * @brief  Declaration of contract type and functions
7  * 
8  * 
9  */
10 #ifndef FRES_CONTRACT_H
11 #define FRES_CONTRACT_H
12
13 #include <fres_blocks.h>
14 #include <fres_container.h>
15 #include <ul_gavl.h>
16 #include <fres_contract_type.h>
17 #include <fres_contract_idl.h>
18 #include <forb/server_id.h>
19
20 /**
21  * Contract data type.
22  * 
23  */
24 struct fres_contract {
25         fres_contract_id_t id;  /**< Global contract ID */
26         struct fres_container *container;       /**< Pointer to the block container (opaque type). */
27 };
28
29 static inline int fres_contract_id_cmp(const fres_contract_id_t *a,
30                                        const fres_contract_id_t *b)
31 {
32         return forb_server_id_cmp((forb_server_id*)a,
33                                   (forb_server_id*)b);
34 }
35
36 static inline char *fres_contract_id_to_string(char *dest,
37                                                const fres_contract_id_t *id,
38                                                size_t n)
39 {
40         return forb_server_id_to_string(dest, (forb_server_id*)id, n);
41 }
42
43 struct fres_contract *fres_contract_new(void);
44 void fres_contract_destroy(struct fres_contract *contract);
45 struct fres_contract *fres_contract_duplicate(struct fres_contract *src);
46
47 static inline int
48 fres_contract_add_block(struct fres_contract *contract,
49                         enum fres_block_type type, void *block)
50 {
51         return fres_container_add_block(contract->container, type, block);
52 }
53 static inline void
54 fres_contract_del_block(struct fres_contract *contract,
55                         enum fres_block_type type)
56 {
57         fres_container_del_block(contract->container, type);
58 }
59
60 static inline void *
61 fres_contract_get_block(struct fres_contract *contract,
62                         enum fres_block_type type)
63 {
64         return fres_container_get_block(contract->container, type);
65 }
66
67 int
68 fres_contract_to_string(char *dest, size_t size, const struct fres_contract *c);
69
70 void
71 fres_contract_print(char *prefix, const struct fres_contract *c);
72
73 #define FRES_CONTRACT_ACCESSOR(type)                                    \
74         static inline int                                               \
75         fres_contract_add_##type(struct fres_contract *contract,        \
76                                  fres_block_##type *block)              \
77         {                                                               \
78                 return fres_container_add_##type(contract->container,   \
79                                                  block);                \
80         }                                                               \
81         static inline fres_block_##type *                               \
82         fres_contract_get_##type(struct fres_contract *contract)        \
83         {                                                               \
84                 return fres_container_get_##type(contract->container);  \
85         }                                                               \
86         static inline void                                              \
87         fres_contract_del_##type(struct fres_contract *contract)        \
88         {                                                               \
89                 fres_container_del_##type(contract->container);         \
90         }
91
92 FRES_CONTRACT_ACCESSOR(label)
93 FRES_CONTRACT_ACCESSOR(resource)
94 FRES_CONTRACT_ACCESSOR(basic)
95 FRES_CONTRACT_ACCESSOR(timing_reqs)
96 FRES_CONTRACT_ACCESSOR(spare_capacity)
97
98 #endif