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