Store appointments for the current day in a vector

This allows for more efficient access to items at specific positions.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2014-05-16 09:45:11 +02:00
parent 45af8c5880
commit f513fa4627
3 changed files with 21 additions and 19 deletions

View File

@ -697,7 +697,7 @@ void custom_keys_config(void);
void custom_config_main(void); void custom_config_main(void);
/* day.c */ /* day.c */
void day_free_list(void); void day_free_vector(void);
char *day_item_get_mesg(struct day_item *); char *day_item_get_mesg(struct day_item *);
char *day_item_get_note(struct day_item *); char *day_item_get_note(struct day_item *);
void day_item_erase_note(struct day_item *); void day_item_erase_note(struct day_item *);

View File

@ -42,27 +42,27 @@
#include "calcurse.h" #include "calcurse.h"
static llist_t day_items; static vector_t day_items;
static void day_free(struct day_item *day) static void day_free(struct day_item *day)
{ {
mem_free(day); mem_free(day);
} }
static void day_init_list(void) static void day_init_vector(void)
{ {
LLIST_INIT(&day_items); VECTOR_INIT(&day_items, 16);
} }
/* /*
* Free the current day linked list containing the events and appointments. * Free the current day vector containing the events and appointments.
* Must not free associated message and note, because their are not dynamically * Must not free associated message and note, because their are not dynamically
* allocated (only pointers to real objects are stored in this structure). * allocated (only pointers to real objects are stored in this structure).
*/ */
void day_free_list(void) void day_free_vector(void)
{ {
LLIST_FREE_INNER(&day_items, day_free); VECTOR_FREE_INNER(&day_items, day_free);
LLIST_FREE(&day_items); VECTOR_FREE(&day_items);
} }
static int day_cmp_start(struct day_item *a, struct day_item *b) static int day_cmp_start(struct day_item *a, struct day_item *b)
@ -88,7 +88,7 @@ static void day_add_item(int type, long start, union aptev_ptr item)
day->start = start; day->start = start;
day->item = item; day->item = item;
LLIST_ADD_SORTED(&day_items, day, day_cmp_start); VECTOR_ADD(&day_items, day);
} }
/* Get the message of an item. */ /* Get the message of an item. */
@ -341,14 +341,16 @@ day_store_items(long date, unsigned *pnb_events, unsigned *pnb_apoints,
int nb_events, nb_recur_events; int nb_events, nb_recur_events;
int nb_apoints, nb_recur_apoints; int nb_apoints, nb_recur_apoints;
day_free_list(); day_free_vector();
day_init_list(); day_init_vector();
nb_recur_events = day_store_recur_events(date, regex); nb_recur_events = day_store_recur_events(date, regex);
nb_events = day_store_events(date, regex); nb_events = day_store_events(date, regex);
nb_recur_apoints = day_store_recur_apoints(date, regex); nb_recur_apoints = day_store_recur_apoints(date, regex);
nb_apoints = day_store_apoints(date, regex); nb_apoints = day_store_apoints(date, regex);
VECTOR_SORT(&day_items, day_cmp_start);
if (pnb_apoints) if (pnb_apoints)
*pnb_apoints = nb_apoints + nb_recur_apoints; *pnb_apoints = nb_apoints + nb_recur_apoints;
if (pnb_events) if (pnb_events)
@ -470,15 +472,15 @@ display_item(struct day_item *day, int incolor, int width, int y, int x)
*/ */
void day_write_pad(long date, int width, int length, int incolor) void day_write_pad(long date, int width, int length, int incolor)
{ {
llist_item_t *i; int i;
int line, item_number; int line, item_number;
const int x_pos = 0; const int x_pos = 0;
unsigned draw_line = 0; unsigned draw_line = 0;
line = item_number = 0; line = item_number = 0;
LLIST_FOREACH(&day_items, i) { VECTOR_FOREACH(&day_items, i) {
struct day_item *day = LLIST_TS_GET_DATA(i); struct day_item *day = VECTOR_NTH(&day_items, i);
/* First print the events for current day. */ /* First print the events for current day. */
if (day->type < RECUR_APPT) { if (day->type < RECUR_APPT) {
@ -509,12 +511,12 @@ void day_write_pad(long date, int width, int length, int incolor)
void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt, void day_write_stdout(long date, const char *fmt_apt, const char *fmt_rapt,
const char *fmt_ev, const char *fmt_rev, int *limit) const char *fmt_ev, const char *fmt_rev, int *limit)
{ {
llist_item_t *i; int i;
LLIST_FOREACH(&day_items, i) { VECTOR_FOREACH(&day_items, i) {
if (*limit == 0) if (*limit == 0)
break; break;
struct day_item *day = LLIST_TS_GET_DATA(i); struct day_item *day = VECTOR_NTH(&day_items, i);
switch (day->type) { switch (day->type) {
case APPT: case APPT:
@ -727,7 +729,7 @@ int day_paste_item(struct day_item *p, long date)
/* Returns a structure containing the selected item. */ /* Returns a structure containing the selected item. */
struct day_item *day_get_item(int item_number) struct day_item *day_get_item(int item_number)
{ {
return LLIST_GET_DATA(LLIST_NTH(&day_items, item_number - 1)); return VECTOR_NTH(&day_items, item_number - 1);
} }
/* Attach a note to an appointment or event. */ /* Attach a note to an appointment or event. */

View File

@ -102,7 +102,7 @@ void free_user_data(void)
{ {
unsigned i; unsigned i;
day_free_list(); day_free_vector();
event_llist_free(); event_llist_free();
apoint_llist_free(); apoint_llist_free();
recur_apoint_llist_free(); recur_apoint_llist_free();