summaryrefslogtreecommitdiff
path: root/sql/gcalc_slicescan.h
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2011-10-16 19:55:37 +0500
committerAlexey Botchkov <holyfoot@askmonty.org>2011-10-16 19:55:37 +0500
commit248f2da679281c2b35a1719d830b6f0db4d791ac (patch)
tree2189c3819572c6fa8e8d383a7fde7bf108f9e359 /sql/gcalc_slicescan.h
parent486df97986d839b7ad24a6c36ad6ca43875312e6 (diff)
downloadmariadb-git-248f2da679281c2b35a1719d830b6f0db4d791ac.tar.gz
GIS code cleanup.
Diffstat (limited to 'sql/gcalc_slicescan.h')
-rw-r--r--sql/gcalc_slicescan.h102
1 files changed, 32 insertions, 70 deletions
diff --git a/sql/gcalc_slicescan.h b/sql/gcalc_slicescan.h
index e5323952afe..92f22d9db44 100644
--- a/sql/gcalc_slicescan.h
+++ b/sql/gcalc_slicescan.h
@@ -114,78 +114,34 @@ protected:
/* Internal Gcalc coordinates to provide the precise calculations */
#define GCALC_DIG_BASE 1000000000
-typedef int32 gcalc_digit_t;
-typedef long long gcalc_coord2;
-
+typedef uint32 gcalc_digit_t;
+typedef unsigned long long gcalc_coord2;
+typedef gcalc_digit_t Gcalc_internal_coord;
#define GCALC_COORD_BASE 2
+#define GCALC_COORD_BASE2 4
+#define GCALC_COORD_BASE3 6
+#define GCALC_COORD_BASE4 8
+#define GCALC_COORD_BASE5 10
-class Gcalc_internal_coord
-{
-public:
- gcalc_digit_t *digits;
- int sign;
- int n_digits;
- void set_zero();
- int is_zero() const;
-#ifdef GCALC_CHECK_WITH_FLOAT
- static double *coord_extent;
- long double get_double() const;
-#endif /*GCALC_CHECK_WITH_FLOAT*/
-};
-
+typedef gcalc_digit_t Gcalc_coord1[GCALC_COORD_BASE];
+typedef gcalc_digit_t Gcalc_coord2[GCALC_COORD_BASE*2];
+typedef gcalc_digit_t Gcalc_coord3[GCALC_COORD_BASE*3];
-class Gcalc_coord1 : public Gcalc_internal_coord
-{
- gcalc_digit_t c[GCALC_COORD_BASE];
-public:
- void init()
- {
- n_digits= GCALC_COORD_BASE;
- digits= c;
- }
- int set_double(double d, double ext);
- void copy(const Gcalc_coord1 *from);
-};
+void gcalc_mul_coord(Gcalc_internal_coord *result, int result_len,
+ const Gcalc_internal_coord *a, int a_len,
+ const Gcalc_internal_coord *b, int b_len);
-class Gcalc_coord2 : public Gcalc_internal_coord
-{
- gcalc_digit_t c[GCALC_COORD_BASE*2];
-public:
- void init()
- {
- n_digits= GCALC_COORD_BASE*2;
- digits= c;
- }
-};
-
-
-class Gcalc_coord3 : public Gcalc_internal_coord
-{
- gcalc_digit_t c[GCALC_COORD_BASE*3];
- public:
- void init()
- {
- n_digits= GCALC_COORD_BASE*3;
- digits= c;
- }
-};
-
-
-void gcalc_mul_coord(Gcalc_internal_coord *result,
+void gcalc_add_coord(Gcalc_internal_coord *result, int result_len,
const Gcalc_internal_coord *a,
const Gcalc_internal_coord *b);
-void gcalc_add_coord(Gcalc_internal_coord *result,
- const Gcalc_internal_coord *a,
- const Gcalc_internal_coord *b);
-
-void gcalc_sub_coord(Gcalc_internal_coord *result,
+void gcalc_sub_coord(Gcalc_internal_coord *result, int result_len,
const Gcalc_internal_coord *a,
const Gcalc_internal_coord *b);
int gcalc_cmp_coord(const Gcalc_internal_coord *a,
- const Gcalc_internal_coord *b);
+ const Gcalc_internal_coord *b, int len);
/* Internal coordinates declarations end. */
@@ -280,11 +236,11 @@ public:
#ifdef GCALC_CHECK_WITH_FLOAT
long double get_double(const Gcalc_internal_coord *c) const;
#endif /*GCALC_CHECK_WITH_FLOAT*/
+ double coord_extent;
private:
Gcalc_dyn_list::Item *m_first;
Gcalc_dyn_list::Item **m_hook;
int m_n_points;
- double coord_extent;
};
@@ -422,10 +378,10 @@ public:
inline const point *get_next() const { return (const point *)next; }
/* Compare the dx_dy parameters regarding the horiz_dir */
/* returns -1 if less, 0 if equal, 1 if bigger */
- static int cmp_dx_dy(const Gcalc_coord1 *dx_a,
- const Gcalc_coord1 *dy_a,
- const Gcalc_coord1 *dx_b,
- const Gcalc_coord1 *dy_b);
+ static int cmp_dx_dy(const Gcalc_coord1 dx_a,
+ const Gcalc_coord1 dy_a,
+ const Gcalc_coord1 dx_b,
+ const Gcalc_coord1 dy_b);
static int cmp_dx_dy(const Gcalc_heap::Info *p1,
const Gcalc_heap::Info *p2,
const Gcalc_heap::Info *p3,
@@ -467,9 +423,16 @@ public:
int x_calculated;
Gcalc_coord3 y_exp;
int y_calculated;
- void calc_t();
- void calc_y_exp();
- void calc_x_exp();
+ void calc_t()
+ {if (!t_calculated) do_calc_t(); }
+ void calc_y_exp()
+ { if (!y_calculated) do_calc_y(); }
+ void calc_x_exp()
+ { if (!x_calculated) do_calc_x(); }
+
+ void do_calc_t();
+ void do_calc_x();
+ void do_calc_y();
};
@@ -540,8 +503,6 @@ private:
point *new_slice_point()
{
point *new_point= (point *)new_item();
- new_point->dx.init();
- new_point->dy.init();
return new_point;
}
intersection_info *new_intersection_info(point *a, point *b)
@@ -553,6 +514,7 @@ private:
return ii;
}
int arrange_event(int do_sorting, int n_intersections);
+ static double get_pure_double(const Gcalc_internal_coord *d, int d_len);
};