mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Add a cmp() function for Recurrence (lists).
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@15631 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
c123a68e28
commit
3373f77979
@ -138,7 +138,7 @@ TODO
|
|||||||
- [x] gnc_sxed_update_cal
|
- [x] gnc_sxed_update_cal
|
||||||
- [x] gnc_sxed_save_sx
|
- [x] gnc_sxed_save_sx
|
||||||
- sx list
|
- sx list
|
||||||
- [ ] recurrence_cmp(...)
|
- [x] recurrence_cmp(...)
|
||||||
- [x] More compact recurrenceListToString(...).
|
- [x] More compact recurrenceListToString(...).
|
||||||
- [ ] remove FreqSpec code
|
- [ ] remove FreqSpec code
|
||||||
- [ ] SX code
|
- [ ] SX code
|
||||||
|
@ -577,3 +577,90 @@ rtn:
|
|||||||
return g_string_free(buf, FALSE);
|
return g_string_free(buf, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ordering, in increasing degrees of frequent-ness:
|
||||||
|
*
|
||||||
|
* day < week < {nth-weekday < month < end-month, last_weekday} < year < once
|
||||||
|
*
|
||||||
|
* all the monthly types are basically together, but are broken down
|
||||||
|
* internally cause they have to be ordered somehow.
|
||||||
|
**/
|
||||||
|
static int cmp_order_indexes[] =
|
||||||
|
{
|
||||||
|
6, // PERIOD_ONCE
|
||||||
|
1, // PERIOD_DAY
|
||||||
|
2, // PERIOD_WEEK
|
||||||
|
// 3, // "semi-monthly" ... Note that this isn't presently used, just the
|
||||||
|
// // way the code worked out. :(
|
||||||
|
4, // PERIOD_MONTH
|
||||||
|
4, // PERIOD_END_OF_MONTH
|
||||||
|
4, // PERIOD_NTH_WEEKDAY
|
||||||
|
4, // PERIOD_LAST_WEEKDAY
|
||||||
|
5, // PERIOD_YEAR
|
||||||
|
};
|
||||||
|
|
||||||
|
static int cmp_monthly_order_indexes[] =
|
||||||
|
{
|
||||||
|
-1, // PERIOD_ONCE
|
||||||
|
-1, // PERIOD_DAY
|
||||||
|
-1, // PERIOD_WEEK
|
||||||
|
2, // PERIOD_MONTH
|
||||||
|
3, // PERIOD_END_OF_MONTH
|
||||||
|
1, // PERIOD_NTH_WEEKDAY
|
||||||
|
4, // PERIOD_LAST_WEEKDAY
|
||||||
|
-1, // PERIOD_YEAR
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
recurrenceCmp(Recurrence *a, Recurrence *b)
|
||||||
|
{
|
||||||
|
PeriodType period_a, period_b;
|
||||||
|
int a_order_index, b_order_index;
|
||||||
|
|
||||||
|
g_return_val_if_fail(a != NULL && b != NULL, 0);
|
||||||
|
g_return_val_if_fail(a != NULL, 1);
|
||||||
|
g_return_val_if_fail(b != NULL, -1);
|
||||||
|
|
||||||
|
period_a = recurrenceGetPeriodType(a);
|
||||||
|
period_b = recurrenceGetPeriodType(b);
|
||||||
|
|
||||||
|
a_order_index = cmp_order_indexes[period_a];
|
||||||
|
b_order_index = cmp_order_indexes[period_b];
|
||||||
|
if (a_order_index != b_order_index)
|
||||||
|
{
|
||||||
|
return a_order_index - b_order_index;
|
||||||
|
}
|
||||||
|
else if (a_order_index == cmp_order_indexes[PERIOD_MONTH])
|
||||||
|
{
|
||||||
|
// re-order intra-month options:
|
||||||
|
a_order_index = cmp_monthly_order_indexes[period_a];
|
||||||
|
b_order_index = cmp_monthly_order_indexes[period_b];
|
||||||
|
g_assert(a_order_index != -1 && b_order_index != -1);
|
||||||
|
if (a_order_index != b_order_index)
|
||||||
|
return a_order_index - b_order_index;
|
||||||
|
}
|
||||||
|
/* else { the basic periods are equal; compare the multipliers } */
|
||||||
|
|
||||||
|
{
|
||||||
|
int a_mult, b_mult;
|
||||||
|
a_mult = recurrenceGetMultiplier(a);
|
||||||
|
b_mult = recurrenceGetMultiplier(b);
|
||||||
|
|
||||||
|
return a_mult - b_mult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
recurrenceListCmp(GList *a, GList *b)
|
||||||
|
{
|
||||||
|
Recurrence *most_freq_a, *most_freq_b;
|
||||||
|
|
||||||
|
g_return_val_if_fail(g_list_length(a) != 0 && g_list_length(b) != 0, 0);
|
||||||
|
g_return_val_if_fail(g_list_length(a) != 0, -1);
|
||||||
|
g_return_val_if_fail(g_list_length(b) != 0, 1);
|
||||||
|
|
||||||
|
most_freq_a = (Recurrence*)g_list_nth_data(g_list_sort(a, (GCompareFunc)recurrenceCmp), 0);
|
||||||
|
most_freq_b = (Recurrence*)g_list_nth_data(g_list_sort(b, (GCompareFunc)recurrenceCmp), 0);
|
||||||
|
|
||||||
|
return recurrenceCmp(most_freq_a, most_freq_b);
|
||||||
|
}
|
||||||
|
@ -166,4 +166,8 @@ gboolean recurrenceListIsWeeklyMultiple(GList *recurrences);
|
|||||||
**/
|
**/
|
||||||
gchar *recurrenceListToCompactString(GList *recurrence_list);
|
gchar *recurrenceListToCompactString(GList *recurrence_list);
|
||||||
|
|
||||||
|
/** @return integer representing the relationship between @a a and @a b, with the semantics of qsort. **/
|
||||||
|
int recurrenceCmp(Recurrence *a, Recurrence *b);
|
||||||
|
int recurrenceListCmp(GList *a, GList *b);
|
||||||
|
|
||||||
#endif /* RECURRENCE_H */
|
#endif /* RECURRENCE_H */
|
||||||
|
@ -382,8 +382,7 @@ _freq_comparator(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer u
|
|||||||
if (a_inst == NULL) return 1;
|
if (a_inst == NULL) return 1;
|
||||||
if (b_inst == NULL) return -1;
|
if (b_inst == NULL) return -1;
|
||||||
|
|
||||||
return gnc_freq_spec_compare(xaccSchedXactionGetFreqSpec(a_inst->sx),
|
return recurrenceListCmp(gnc_sx_get_schedule(a_inst->sx), gnc_sx_get_schedule(b_inst->sx));
|
||||||
xaccSchedXactionGetFreqSpec(b_inst->sx));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
|
Loading…
Reference in New Issue
Block a user