Skip to content

Commit 1130e80

Browse files
committed
refact: move clients asset to it's own file
1 parent 9b4dea7 commit 1130e80

File tree

8 files changed

+188
-165
lines changed

8 files changed

+188
-165
lines changed

source/means-to-an-end/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set(PROJECT_NAME "means-to-an-end")
44
add_executable(${PROJECT_NAME}
55
"${PROJECT_SOURCE_DIR}/source/${PROJECT_NAME}/main.c"
66
"${PROJECT_SOURCE_DIR}/source/${PROJECT_NAME}/asset-prices.c"
7+
"${PROJECT_SOURCE_DIR}/source/${PROJECT_NAME}/client-session.c"
78
"${PROJECT_SOURCE_DIR}/source/${PROJECT_NAME}/messages.c"
89
"${PROJECT_SOURCE_DIR}/source/utils/epoll.c"
910
"${PROJECT_SOURCE_DIR}/source/utils/queue.c"

source/means-to-an-end/asset-prices.c

-147
Original file line numberDiff line numberDiff line change
@@ -100,150 +100,3 @@ int32_t asset_prices_query(struct asset_prices* ps, struct asset_price_query* pq
100100

101101
return num_prices == 0 ? 0 : mean / num_prices;
102102
}
103-
104-
105-
void clients_asset_init(struct clients_asset **pca, int client_id)
106-
{
107-
assert(*pca == NULL);
108-
assert(client_id > 0);
109-
110-
*pca = malloc(sizeof(struct clients_asset));
111-
assert(*pca != NULL);
112-
113-
asset_prices_init(&(*pca)->asset, 64);
114-
assert((*pca)->asset != NULL);
115-
116-
(*pca)->next = NULL;
117-
(*pca)->prev = NULL;
118-
(*pca)->client_id = client_id;
119-
}
120-
121-
void clients_asset_get_beg(struct clients_asset **pca) {
122-
// Ensure we start from the beginning of the list
123-
struct clients_asset *prev = (*pca)->prev;
124-
struct clients_asset *first = *pca;
125-
while (prev != NULL) {
126-
first = prev;
127-
prev = prev->prev;
128-
}
129-
130-
*pca = first;
131-
}
132-
133-
void clients_asset_free(struct clients_asset **pca)
134-
{
135-
assert(*pca != NULL);
136-
assert((*pca)->asset != NULL);
137-
138-
// Adjust prev and next values now that middle is gone
139-
struct clients_asset *prev = NULL;
140-
struct clients_asset *next = NULL;
141-
struct clients_asset *curr = *pca;
142-
prev = curr->prev;
143-
next = curr->next;
144-
if (prev != NULL)
145-
prev->next = next;
146-
if (next != NULL)
147-
next->prev = prev;
148-
149-
asset_prices_free(&(curr->asset));
150-
free(curr);
151-
curr = NULL;
152-
153-
// Adjust argument pointer
154-
if (prev != NULL) {
155-
*pca = prev;
156-
return;
157-
}
158-
159-
if (next != NULL) {
160-
*pca = next;
161-
return;
162-
}
163-
164-
*pca = NULL;
165-
}
166-
167-
void clients_asset_free_all(struct clients_asset **pca)
168-
{
169-
assert(*pca != NULL);
170-
assert((*pca)->asset != NULL);
171-
172-
clients_asset_get_beg(pca);
173-
174-
struct clients_asset *next = NULL;
175-
struct clients_asset *curr = *pca;
176-
do {
177-
next = curr->next;
178-
asset_prices_free(&(curr->asset));
179-
free(curr);
180-
curr = NULL;
181-
curr = next;
182-
} while (curr != NULL);
183-
184-
*pca = NULL;
185-
}
186-
187-
void clients_asset_get_end(struct clients_asset **pca) {
188-
// Ensure we are at the end of the list
189-
struct clients_asset *next = (*pca)->next;
190-
struct clients_asset *last = *pca;
191-
while (next != NULL) {
192-
last = next;
193-
next = next->next;
194-
}
195-
196-
*pca = last;
197-
}
198-
199-
void clients_asset_add(struct clients_asset **pca, int id)
200-
{
201-
assert(id > 0);
202-
203-
if (*pca == NULL) {
204-
clients_asset_init(pca, id);
205-
return;
206-
}
207-
208-
clients_asset_get_end(pca);
209-
210-
clients_asset_init(&((*pca)->next), id);
211-
struct clients_asset *next = (*pca)->next;
212-
next->prev = *pca;
213-
}
214-
215-
bool clients_asset_remove(struct clients_asset **pca, int id)
216-
{
217-
assert(*pca != NULL);
218-
assert(id > 0);
219-
220-
bool found = clients_asset_find(pca, id);
221-
if (found) {
222-
clients_asset_free(pca);
223-
return true;
224-
}
225-
226-
return false;
227-
}
228-
229-
bool clients_asset_find(struct clients_asset **pca, int id)
230-
{
231-
if (*pca == NULL)
232-
return false;
233-
assert(id > 0);
234-
235-
clients_asset_get_beg(pca);
236-
237-
struct clients_asset *next = NULL;
238-
struct clients_asset *curr = *pca;
239-
do {
240-
if (curr->client_id == id) {
241-
*pca = curr;
242-
return true;
243-
}
244-
next = curr->next;
245-
curr = next;
246-
} while (curr != NULL);
247-
248-
return false;
249-
}

source/means-to-an-end/asset-prices.h

-17
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,6 @@ bool asset_prices_duplicate_timestamp_check(struct asset_prices* ps, int32_t tim
3535
* maxtime, the value returned must be 0.*/
3636
int32_t asset_prices_query(struct asset_prices* ps, struct asset_price_query* pq);
3737

38-
39-
struct clients_asset {
40-
int client_id; // Client's file descriptor
41-
struct asset_prices *asset;
42-
struct client_asset *next;
43-
struct client_asset *prev;
44-
};
45-
46-
void clients_asset_init(struct clients_asset **pca, int client_id);
47-
void clients_asset_free_all(struct clients_asset **pca);
48-
void clients_asset_add(struct clients_asset **pca, int id);
49-
bool clients_asset_remove(struct clients_asset **pca, int id);
50-
bool clients_asset_find(struct clients_asset **pca, int id);
51-
void clients_asset_get_end(struct clients_asset **pca);
52-
void clients_asset_get_beg(struct clients_asset **pca);
53-
void clients_asset_free(struct clients_asset **pca);
54-
5538
#ifdef __cplusplus
5639
}
5740
#endif
+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
2+
#define _GNU_SOURCE
3+
4+
#include <stddef.h>
5+
#include <stdint.h>
6+
#include <stdlib.h>
7+
#include <assert.h>
8+
9+
#include "means-to-an-end/asset-prices.h"
10+
#include "means-to-an-end/client-session.h"
11+
12+
void clients_asset_init(struct clients_asset **pca, int client_id)
13+
{
14+
assert(*pca == NULL);
15+
assert(client_id > 0);
16+
17+
*pca = malloc(sizeof(struct clients_asset));
18+
assert(*pca != NULL);
19+
20+
asset_prices_init(&(*pca)->asset, 64);
21+
assert((*pca)->asset != NULL);
22+
23+
(*pca)->next = NULL;
24+
(*pca)->prev = NULL;
25+
(*pca)->client_id = client_id;
26+
}
27+
28+
void clients_asset_get_beg(struct clients_asset **pca) {
29+
// Ensure we start from the beginning of the list
30+
struct clients_asset *prev = (*pca)->prev;
31+
struct clients_asset *first = *pca;
32+
while (prev != NULL) {
33+
first = prev;
34+
prev = prev->prev;
35+
}
36+
37+
*pca = first;
38+
}
39+
40+
void clients_asset_free(struct clients_asset **pca)
41+
{
42+
assert(*pca != NULL);
43+
assert((*pca)->asset != NULL);
44+
45+
// Adjust prev and next values now that middle is gone
46+
struct clients_asset *prev = NULL;
47+
struct clients_asset *next = NULL;
48+
struct clients_asset *curr = *pca;
49+
prev = curr->prev;
50+
next = curr->next;
51+
if (prev != NULL)
52+
prev->next = next;
53+
if (next != NULL)
54+
next->prev = prev;
55+
56+
asset_prices_free(&(curr->asset));
57+
free(curr);
58+
curr = NULL;
59+
60+
// Adjust argument pointer
61+
if (prev != NULL) {
62+
*pca = prev;
63+
return;
64+
}
65+
66+
if (next != NULL) {
67+
*pca = next;
68+
return;
69+
}
70+
71+
*pca = NULL;
72+
}
73+
74+
void clients_asset_free_all(struct clients_asset **pca)
75+
{
76+
assert(*pca != NULL);
77+
assert((*pca)->asset != NULL);
78+
79+
clients_asset_get_beg(pca);
80+
81+
struct clients_asset *next = NULL;
82+
struct clients_asset *curr = *pca;
83+
do {
84+
next = curr->next;
85+
asset_prices_free(&(curr->asset));
86+
free(curr);
87+
curr = NULL;
88+
curr = next;
89+
} while (curr != NULL);
90+
91+
*pca = NULL;
92+
}
93+
94+
void clients_asset_get_end(struct clients_asset **pca) {
95+
// Ensure we are at the end of the list
96+
struct clients_asset *next = (*pca)->next;
97+
struct clients_asset *last = *pca;
98+
while (next != NULL) {
99+
last = next;
100+
next = next->next;
101+
}
102+
103+
*pca = last;
104+
}
105+
106+
void clients_asset_add(struct clients_asset **pca, int id)
107+
{
108+
assert(id > 0);
109+
110+
if (*pca == NULL) {
111+
clients_asset_init(pca, id);
112+
return;
113+
}
114+
115+
clients_asset_get_end(pca);
116+
117+
clients_asset_init(&((*pca)->next), id);
118+
struct clients_asset *next = (*pca)->next;
119+
next->prev = *pca;
120+
}
121+
122+
bool clients_asset_remove(struct clients_asset **pca, int id)
123+
{
124+
assert(*pca != NULL);
125+
assert(id > 0);
126+
127+
bool found = clients_asset_find(pca, id);
128+
if (found) {
129+
clients_asset_free(pca);
130+
return true;
131+
}
132+
133+
return false;
134+
}
135+
136+
bool clients_asset_find(struct clients_asset **pca, int id)
137+
{
138+
if (*pca == NULL)
139+
return false;
140+
assert(id > 0);
141+
142+
clients_asset_get_beg(pca);
143+
144+
struct clients_asset *next = NULL;
145+
struct clients_asset *curr = *pca;
146+
do {
147+
if (curr->client_id == id) {
148+
*pca = curr;
149+
return true;
150+
}
151+
next = curr->next;
152+
curr = next;
153+
} while (curr != NULL);
154+
155+
return false;
156+
}
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef INCLUDE_CLIENT_SESSION_H_
2+
#define INCLUDE_CLIENT_SESSION_H_
3+
4+
#ifdef __cplusplus
5+
extern "C" {
6+
#endif
7+
8+
struct clients_asset {
9+
int client_id; // Client's file descriptor
10+
struct asset_prices *asset;
11+
struct client_asset *next;
12+
struct client_asset *prev;
13+
};
14+
15+
void clients_asset_init(struct clients_asset **pca, int client_id);
16+
void clients_asset_free_all(struct clients_asset **pca);
17+
void clients_asset_add(struct clients_asset **pca, int id);
18+
bool clients_asset_remove(struct clients_asset **pca, int id);
19+
bool clients_asset_find(struct clients_asset **pca, int id);
20+
void clients_asset_get_end(struct clients_asset **pca);
21+
void clients_asset_get_beg(struct clients_asset **pca);
22+
void clients_asset_free(struct clients_asset **pca);
23+
24+
#ifdef __cplusplus
25+
}
26+
#endif
27+
28+
#endif // INCLUDE_CLIENT-SESSION_H_

source/means-to-an-end/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include "utils/sockets.h"
2323
#include "utils/utils.h"
2424

25-
#include "means-to-an-end/asset-prices.h"
25+
#include "means-to-an-end/client-session.h"
2626
#include "means-to-an-end/messages.h"
2727

2828
#define LOG_FILE "/tmp/network-exercises-means-to-an-end.log"

test/means-to-an-end/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
add_executable(messages-prices-test
33
"${CMAKE_SOURCE_DIR}/source/log/log.c"
44
"${CMAKE_SOURCE_DIR}/source/means-to-an-end/asset-prices.c"
5+
"${CMAKE_SOURCE_DIR}/source/means-to-an-end/client-session.c"
56
messages-prices-test.cpp
67
)
78
target_link_libraries(

test/means-to-an-end/messages-prices-test.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <catch2/catch.hpp>
1919
#include "means-to-an-end/asset-prices.h"
20+
#include "means-to-an-end/client-session.h"
2021

2122
TEST_CASE("prices_init initializes prices structure correctly", "[prices]")
2223
{

0 commit comments

Comments
 (0)