1 #ifndef _GNM_RANGES_H_ 2 # define _GNM_RANGES_H_ 3 4 #include <gnumeric.h> 5 #include <glib-object.h> 6 7 G_BEGIN_DECLS 8 9 /** 10 * range_equal: 11 * @a: First range 12 * @b: Second range 13 * 14 * NB. commutative, symmetric, and transitive. 15 * 16 * Returns: True if both ranges are equal. 17 **/ 18 #define range_equal(a,b) ((a)->start.row == (b)->start.row && \ 19 (a)->end.row == (b)->end.row && \ 20 (a)->start.col == (b)->start.col && \ 21 (a)->end.col == (b)->end.col) 22 23 GType gnm_range_get_type (void); /* GBoxedType */ 24 GnmRange *gnm_range_dup (GnmRange const *r); 25 gboolean gnm_range_equal (GnmRange const *a, GnmRange const *b); 26 int gnm_range_compare (GnmRange const *a, GnmRange const *b); 27 28 /** 29 * range_overlap: 30 * @a: First range 31 * @b: Second range 32 * 33 * NB. commutative, symmetric, but not transitive. 34 * 35 * Returns: True if the ranges overlap at all. 36 **/ 37 #define range_overlap(a,b) (((a)->end.row >= (b)->start.row) && \ 38 ((b)->end.row >= (a)->start.row) && \ 39 ((a)->end.col >= (b)->start.col) && \ 40 ((b)->end.col >= (a)->start.col)) 41 42 /** 43 * range_contains: 44 * @r: range to operate on 45 * @x: column, 46 * @y: row co-ordinate 47 * 48 * Determine if a range contains a col,row co-ordinate. 49 * 50 * Return value: TRUE if co-ordinate contained. 51 **/ 52 #define range_contains(r,x,y) (((y) <= (r)->end.row) && \ 53 ((y) >= (r)->start.row) && \ 54 ((x) >= (r)->start.col) && \ 55 ((x) <= (r)->end.col)) 56 57 void gnm_range_simplify (GArray *arr); 58 59 /* 60 * Quickly Test if a range is valid 61 */ 62 #define range_valid(r) ((r)->start.col <= (r)->end.col && \ 63 (r)->start.row <= (r)->end.row) 64 65 #define range_fragment_free(f) g_slist_free_full ((f), g_free) 66 67 GnmRange *range_init_full_sheet (GnmRange *r, Sheet const *sheet); 68 GnmRange *range_init_cols (GnmRange *r, Sheet const *sheet, 69 int start_col, int end_col); 70 GnmRange *range_init_rows (GnmRange *r, Sheet const *sheet, 71 int start_row, int end_row); 72 GnmRange *range_init_invalid (GnmRange *r); 73 GnmRange *range_init_rangeref (GnmRange *r, GnmRangeRef const *rr); 74 GnmRange *range_init_value (GnmRange *r, GnmValue const *v); 75 GnmRange *range_init_cellpos (GnmRange *r, GnmCellPos const *pos); 76 GnmRange *range_init_cellpos_size (GnmRange *r, GnmCellPos const *start, 77 int cols, int rows); 78 GnmRange *range_init (GnmRange *r, int start_col, int start_row, 79 int end_col, int end_row); 80 gboolean range_parse (GnmRange *r, char const *text, 81 GnmSheetSize const *ss); 82 83 void range_list_destroy (GSList *ranges); 84 85 int range_width (GnmRange const *r); 86 int range_height (GnmRange const *r); 87 gboolean range_is_singleton (GnmRange const *r); 88 gboolean range_is_full (GnmRange const *r, Sheet const *sheet, gboolean horiz); 89 void range_clip_to_finite(GnmRange *range, Sheet *sheet); 90 gboolean range_contained (GnmRange const *a, GnmRange const *b); 91 gboolean range_intersection (GnmRange *r, 92 GnmRange const *a, 93 GnmRange const *b); 94 void range_normalize (GnmRange *src); 95 GnmRange range_union (GnmRange const *a, GnmRange const *b); 96 void range_ensure_sanity (GnmRange *range, Sheet const *sheet); 97 gboolean range_is_sane (GnmRange const *range); 98 gboolean range_translate (GnmRange *range, Sheet const *sheet, 99 int col_offset, int row_offset); 100 gboolean range_transpose (GnmRange *range, Sheet const *sheet, 101 GnmCellPos const *origin); 102 103 char const *range_as_string (GnmRange const *r); 104 void range_dump (GnmRange const *r, char const *suffix); 105 106 GSList *range_split_ranges (GnmRange const *hard, GnmRange const *soft); 107 GSList *range_fragment (GnmRange const *a, GnmRange const *b); 108 109 GType gnm_sheet_range_get_type (void); /* GBoxedType */ 110 GnmSheetRange *gnm_sheet_range_new (Sheet *sheet, GnmRange const *r); 111 void gnm_sheet_range_free (GnmSheetRange *r); 112 gboolean gnm_sheet_range_from_value (GnmSheetRange *r, GnmValue const *v); 113 gboolean gnm_sheet_range_overlap (GnmSheetRange const *a, GnmSheetRange const *b); 114 GnmSheetRange *gnm_sheet_range_dup (GnmSheetRange const *sr); 115 gboolean gnm_sheet_range_equal (GnmSheetRange const *a, 116 GnmSheetRange const *b); 117 118 char *global_range_name (Sheet const *sheet, GnmRange const *r); 119 char *undo_cell_pos_name (Sheet const *sheet, GnmCellPos const *pos); 120 char *undo_range_name (Sheet const *sheet, GnmRange const *r); 121 char *undo_range_list_name (Sheet const *sheet, GSList const *ranges); 122 123 GSList *global_range_list_parse (Sheet *sheet, char const *str); 124 GnmValue *global_range_list_foreach (GSList *gr_list, GnmEvalPos const *ep, 125 CellIterFlags flags, 126 CellIterFunc handler, 127 gpointer closure); 128 gboolean global_range_contained (Sheet const *sheet, 129 GnmValue const *a, GnmValue const *b); 130 131 G_END_DECLS 132 133 #endif /* _GNM_RANGES_H_ */ 134