1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 # define _GNM_RANGES_H_
6 #include <glib-object.h>
15 * NB. commutative, symmetric, and transitive.
17 * Returns: True if both ranges are equal.
19 #define range_equal(a,b) ((a)->start.row == (b)->start.row && \
20 (a)->end.row == (b)->end.row && \
21 (a)->start.col == (b)->start.col && \
22 (a)->end.col == (b)->end.col)
24 GType
gnm_range_get_type (void); /* GBoxedType */
25 GnmRange
*gnm_range_dup (GnmRange
const *r
);
26 gboolean
gnm_range_equal (GnmRange
const *a
, GnmRange
const *b
);
27 int gnm_range_compare (GnmRange
const *a
, GnmRange
const *b
);
34 * NB. commutative, symmetric, but not transitive.
36 * Returns: True if the ranges overlap at all.
38 #define range_overlap(a,b) (((a)->end.row >= (b)->start.row) && \
39 ((b)->end.row >= (a)->start.row) && \
40 ((a)->end.col >= (b)->start.col) && \
41 ((b)->end.col >= (a)->start.col))
45 * @r: range to operate on
49 * Determine if a range contains a col,row co-ordinate.
51 * Return value: TRUE if co-ordinate contained.
53 #define range_contains(r,x,y) (((y) <= (r)->end.row) && \
54 ((y) >= (r)->start.row) && \
55 ((x) >= (r)->start.col) && \
56 ((x) <= (r)->end.col))
59 * Quickly Test if a range is valid
61 #define range_valid(r) ((r)->start.col <= (r)->end.col && \
62 (r)->start.row <= (r)->end.row)
64 #define range_fragment_free(f) g_slist_free_full ((f), g_free)
66 GnmRange
*range_init_full_sheet (GnmRange
*r
, Sheet
const *sheet
);
67 GnmRange
*range_init_cols (GnmRange
*r
, Sheet
const *sheet
,
68 int start_col
, int end_col
);
69 GnmRange
*range_init_rows (GnmRange
*r
, Sheet
const *sheet
,
70 int start_row
, int end_row
);
71 GnmRange
*range_init_invalid (GnmRange
*r
);
72 GnmRange
*range_init_rangeref (GnmRange
*r
, GnmRangeRef
const *rr
);
73 GnmRange
*range_init_value (GnmRange
*r
, GnmValue
const *v
);
74 GnmRange
*range_init_cellpos (GnmRange
*r
, GnmCellPos
const *pos
);
75 GnmRange
*range_init_cellpos_size (GnmRange
*r
, GnmCellPos
const *start
,
77 GnmRange
*range_init (GnmRange
*r
, int start_col
, int start_row
,
78 int end_col
, int end_row
);
79 gboolean
range_parse (GnmRange
*r
, char const *text
,
80 GnmSheetSize
const *ss
);
82 void range_list_destroy (GSList
*ranges
);
84 int range_width (GnmRange
const *r
);
85 int range_height (GnmRange
const *r
);
86 gboolean
range_is_singleton (GnmRange
const *r
);
87 gboolean
range_is_full (GnmRange
const *r
, Sheet
const *sheet
, gboolean horiz
);
88 void range_clip_to_finite(GnmRange
*range
, Sheet
*sheet
);
89 gboolean
range_contained (GnmRange
const *a
, GnmRange
const *b
);
90 gboolean
range_intersection (GnmRange
*r
,
93 void range_normalize (GnmRange
*src
);
94 GnmRange
range_union (GnmRange
const *a
, GnmRange
const *b
);
95 void range_ensure_sanity (GnmRange
*range
, Sheet
const *sheet
);
96 gboolean
range_is_sane (GnmRange
const *range
);
97 gboolean
range_translate (GnmRange
*range
, Sheet
const *sheet
,
98 int col_offset
, int row_offset
);
99 gboolean
range_transpose (GnmRange
*range
, Sheet
const *sheet
,
100 GnmCellPos
const *origin
);
102 char const *range_as_string (GnmRange
const *r
);
103 void range_dump (GnmRange
const *r
, char const *suffix
);
105 GSList
*range_split_ranges (GnmRange
const *hard
, GnmRange
const *soft
);
106 GSList
*range_fragment (GnmRange
const *a
, GnmRange
const *b
);
108 GType
gnm_sheet_range_get_type (void); /* GBoxedType */
109 GnmSheetRange
*gnm_sheet_range_new (Sheet
*sheet
, GnmRange
const *r
);
110 void gnm_sheet_range_free (GnmSheetRange
*r
);
111 gboolean
gnm_sheet_range_from_value (GnmSheetRange
*r
, GnmValue
const *v
);
112 gboolean
gnm_sheet_range_overlap (GnmSheetRange
const *a
, GnmSheetRange
const *b
);
113 GnmSheetRange
*gnm_sheet_range_dup (GnmSheetRange
const *sr
);
114 gboolean
gnm_sheet_range_equal (GnmSheetRange
const *a
,
115 GnmSheetRange
const *b
);
117 char *global_range_name (Sheet
const *sheet
, GnmRange
const *r
);
118 char *undo_cell_pos_name (Sheet
const *sheet
, GnmCellPos
const *pos
);
119 char *undo_range_name (Sheet
const *sheet
, GnmRange
const *r
);
120 char *undo_range_list_name (Sheet
const *sheet
, GSList
const *ranges
);
122 GSList
*global_range_list_parse (Sheet
*sheet
, char const *str
);
123 GnmValue
*global_range_list_foreach (GSList
*gr_list
, GnmEvalPos
const *ep
,
125 CellIterFunc handler
,
127 gboolean
global_range_contained (Sheet
const *sheet
,
128 GnmValue
const *a
, GnmValue
const *b
);
132 #endif /* _GNM_RANGES_H_ */