Queue: add constructor and destructor
This commit is contained in:
		| @@ -70,12 +70,10 @@ struct playlist { | ||||
| 	int queued; | ||||
|  | ||||
| 	playlist(unsigned max_length) | ||||
| 		:current(-1), queued(-1) { | ||||
| 		queue_init(&queue, max_length); | ||||
| 		:queue(max_length), current(-1), queued(-1) { | ||||
| 	} | ||||
|  | ||||
| 	~playlist() { | ||||
| 		queue_finish(&queue); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -300,40 +300,32 @@ queue_clear(struct queue *queue) | ||||
| 	queue->length = 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| queue_init(struct queue *queue, unsigned max_length) | ||||
| queue::queue(unsigned _max_length) | ||||
| 	:max_length(_max_length), length(0), | ||||
| 	 version(1), | ||||
| 	 items(g_new(struct queue_item, max_length)), | ||||
| 	 order((unsigned *)g_malloc(sizeof(order[0]) * max_length)), | ||||
| 	 id_to_position((int *)g_malloc(sizeof(id_to_position[0]) * | ||||
| 					max_length * QUEUE_HASH_MULT)), | ||||
| 	 repeat(false), | ||||
| 	 single(false), | ||||
| 	 consume(false), | ||||
| 	 random(false), | ||||
| 	 rand(g_rand_new()) | ||||
| { | ||||
| 	queue->max_length = max_length; | ||||
| 	queue->length = 0; | ||||
| 	queue->version = 1; | ||||
| 	queue->repeat = false; | ||||
| 	queue->random = false; | ||||
| 	queue->single = false; | ||||
| 	queue->consume = false; | ||||
|  | ||||
| 	queue->items = g_new(struct queue_item, max_length); | ||||
| 	queue->order = (unsigned *) | ||||
| 		g_malloc(sizeof(queue->order[0]) * max_length); | ||||
| 	queue->id_to_position = (int *) | ||||
| 		g_malloc(sizeof(queue->id_to_position[0]) * | ||||
| 			 max_length * QUEUE_HASH_MULT); | ||||
|  | ||||
| 	for (unsigned i = 0; i < max_length * QUEUE_HASH_MULT; ++i) | ||||
| 		queue->id_to_position[i] = -1; | ||||
|  | ||||
| 	queue->rand = g_rand_new(); | ||||
| 		id_to_position[i] = -1; | ||||
| } | ||||
|  | ||||
| void | ||||
| queue_finish(struct queue *queue) | ||||
| queue::~queue() | ||||
| { | ||||
| 	queue_clear(queue); | ||||
| 	queue_clear(this); | ||||
|  | ||||
| 	g_free(queue->items); | ||||
| 	g_free(queue->order); | ||||
| 	g_free(queue->id_to_position); | ||||
| 	g_free(items); | ||||
| 	g_free(order); | ||||
| 	g_free(id_to_position); | ||||
|  | ||||
| 	g_rand_free(queue->rand); | ||||
| 	g_rand_free(rand); | ||||
| } | ||||
|  | ||||
| static const struct queue_item * | ||||
|   | ||||
| @@ -99,6 +99,17 @@ struct queue { | ||||
|  | ||||
| 	/** random number generator for shuffle and random mode */ | ||||
| 	GRand *rand; | ||||
|  | ||||
| 	queue(unsigned max_length); | ||||
|  | ||||
| 	/** | ||||
| 	 * Deinitializes a queue object.  It does not free the queue | ||||
| 	 * pointer itself. | ||||
| 	 */ | ||||
| 	~queue(); | ||||
|  | ||||
| 	queue(const queue &other) = delete; | ||||
| 	queue &operator=(const queue &other) = delete; | ||||
| }; | ||||
|  | ||||
| static inline unsigned | ||||
| @@ -232,19 +243,6 @@ queue_song_newer(const struct queue *queue, unsigned position, | ||||
| 		queue->items[position].version == 0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Initialize a queue object. | ||||
|  */ | ||||
| void | ||||
| queue_init(struct queue *queue, unsigned max_length); | ||||
|  | ||||
| /** | ||||
|  * Deinitializes a queue object.  It does not free the queue pointer | ||||
|  * itself. | ||||
|  */ | ||||
| void | ||||
| queue_finish(struct queue *queue); | ||||
|  | ||||
| /** | ||||
|  * Returns the order number following the specified one.  This takes | ||||
|  * end of queue and "repeat" mode into account. | ||||
|   | ||||
| @@ -50,8 +50,7 @@ main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) | ||||
| { | ||||
| 	struct song songs[16]; | ||||
|  | ||||
| 	struct queue queue; | ||||
| 	queue_init(&queue, 32); | ||||
| 	struct queue queue(32); | ||||
|  | ||||
| 	for (unsigned i = 0; i < G_N_ELEMENTS(songs); ++i) | ||||
| 		queue_append(&queue, &songs[i], 0); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann