@@ -11,11 +11,10 @@ extern crate byteorder;
11
11
12
12
use std:: io:: prelude:: * ;
13
13
use std:: fmt;
14
- use std:: mem;
15
14
use std:: marker:: PhantomData ;
16
15
use std:: iter:: FromIterator ;
17
16
use std:: convert:: From ;
18
- use postgres:: types:: { Type , IsNull , ToSql , FromSql , SessionInfo , WrongType } ;
17
+ use postgres:: types:: { Type , IsNull , ToSql , FromSql , SessionInfo } ;
19
18
use byteorder:: { ReadBytesExt , WriteBytesExt , BigEndian , LittleEndian } ;
20
19
pub mod mars;
21
20
@@ -144,111 +143,119 @@ impl SRID for NoSRID {
144
143
fn as_srid ( ) -> Option < i32 > { None }
145
144
}
146
145
146
+ mod detail {
147
+ use std:: io:: prelude:: * ;
148
+ use std:: mem;
149
+ use byteorder:: { ReadBytesExt , WriteBytesExt , LittleEndian } ;
150
+ use postgres:: types:: Type ;
151
+ use super :: { Error , SRID , read_f64, read_u32, read_i32} ;
147
152
148
- trait ToPoint : Sized {
149
- type SRIDType : SRID ;
153
+ pub trait ToPoint : Sized {
154
+ type SRIDType : SRID ;
150
155
151
- fn type_id ( ) -> u32 {
152
- let mut type_ = 0x0000_0001_u32 ;
153
- if Self :: opt_srid ( ) . is_some ( ) {
154
- type_ |= 0x20000000 ;
156
+ fn type_id ( ) -> u32 {
157
+ let mut type_ = 0x0000_0001_u32 ;
158
+ if Self :: opt_srid ( ) . is_some ( ) {
159
+ type_ |= 0x20000000 ;
160
+ }
161
+ if Self :: has_z ( ) {
162
+ type_ |= 0x80000000 ;
163
+ }
164
+ if Self :: has_m ( ) {
165
+ type_ != 0x40000000 ;
166
+ }
167
+ type_
155
168
}
156
- if Self :: has_z ( ) {
157
- type_ |= 0x80000000 ;
169
+ fn opt_srid ( ) -> Option < i32 > {
170
+ Self :: SRIDType :: as_srid ( )
158
171
}
159
- if Self :: has_m ( ) {
160
- type_ != 0x40000000 ;
172
+ fn x ( & self ) -> f64 {
173
+ unsafe { * mem :: transmute :: < _ , * const f64 > ( self ) }
161
174
}
162
- type_
163
- }
164
- fn opt_srid ( ) -> Option < i32 > {
165
- Self :: SRIDType :: as_srid ( )
166
- }
167
- fn x ( & self ) -> f64 {
168
- unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) }
169
- }
170
- fn y ( & self ) -> f64 {
171
- unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) . offset ( 1 ) }
172
- }
173
- fn opt_z ( & self ) -> Option < f64 > {
174
- None
175
- }
176
- fn opt_m ( & self ) -> Option < f64 > {
177
- None
178
- }
179
- fn has_z ( ) -> bool { false }
180
- fn has_m ( ) -> bool { false }
175
+ fn y ( & self ) -> f64 {
176
+ unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) . offset ( 1 ) }
177
+ }
178
+ fn opt_z ( & self ) -> Option < f64 > {
179
+ None
180
+ }
181
+ fn opt_m ( & self ) -> Option < f64 > {
182
+ None
183
+ }
184
+ fn has_z ( ) -> bool { false }
185
+ fn has_m ( ) -> bool { false }
181
186
182
- fn new_from_opt_vals ( x : f64 , y : f64 , z : Option < f64 > , m : Option < f64 > ) -> Self ;
187
+ fn new_from_opt_vals ( x : f64 , y : f64 , z : Option < f64 > , m : Option < f64 > ) -> Self ;
183
188
184
- fn read_ewkb < R : Read > ( raw : & mut R ) -> Result < Self , Error > {
185
- let byte_order = try!( raw. read_i8 ( ) ) ;
186
- let is_be = byte_order == 0i8 ;
189
+ fn read_ewkb < R : Read > ( raw : & mut R ) -> Result < Self , Error > {
190
+ let byte_order = try!( raw. read_i8 ( ) ) ;
191
+ let is_be = byte_order == 0i8 ;
187
192
188
- let type_id = try!( read_u32 ( raw, is_be) ) ;
189
- if type_id != Self :: type_id ( ) {
190
- return Err ( Error :: Read ( "type id not match" . into ( ) ) )
191
- }
193
+ let type_id = try!( read_u32 ( raw, is_be) ) ;
194
+ if type_id != Self :: type_id ( ) {
195
+ return Err ( Error :: Read ( "type id not match" . into ( ) ) )
196
+ }
192
197
193
- if Self :: opt_srid ( ) . is_some ( ) {
194
- if Self :: opt_srid ( ) != Some ( try!( read_i32 ( raw, is_be) ) ) {
195
- return Err ( Error :: Read ( "srid not match" . into ( ) ) )
198
+ if Self :: opt_srid ( ) . is_some ( ) {
199
+ if Self :: opt_srid ( ) != Some ( try!( read_i32 ( raw, is_be) ) ) {
200
+ return Err ( Error :: Read ( "srid not match" . into ( ) ) )
201
+ }
196
202
}
197
- }
198
203
199
- Self :: read_ewkb_body ( raw, is_be)
200
- }
204
+ Self :: read_ewkb_body ( raw, is_be)
205
+ }
201
206
202
- fn read_ewkb_body < R : Read > ( raw : & mut R , is_be : bool ) -> Result < Self , Error > {
203
- let x = try!( read_f64 ( raw, is_be) ) ;
204
- let y = try!( read_f64 ( raw, is_be) ) ;
205
- let z = if Self :: has_z ( ) {
206
- Some ( try!( read_f64 ( raw, is_be) ) )
207
- } else {
208
- None
209
- } ;
210
- let m = if Self :: has_m ( ) {
211
- Some ( try!( read_f64 ( raw, is_be) ) )
212
- } else {
213
- None
214
- } ;
215
- Ok ( Self :: new_from_opt_vals ( x, y, z, m) )
216
- }
207
+ fn read_ewkb_body < R : Read > ( raw : & mut R , is_be : bool ) -> Result < Self , Error > {
208
+ let x = try!( read_f64 ( raw, is_be) ) ;
209
+ let y = try!( read_f64 ( raw, is_be) ) ;
210
+ let z = if Self :: has_z ( ) {
211
+ Some ( try!( read_f64 ( raw, is_be) ) )
212
+ } else {
213
+ None
214
+ } ;
215
+ let m = if Self :: has_m ( ) {
216
+ Some ( try!( read_f64 ( raw, is_be) ) )
217
+ } else {
218
+ None
219
+ } ;
220
+ Ok ( Self :: new_from_opt_vals ( x, y, z, m) )
221
+ }
217
222
218
- fn write_ewkb < W : Write +?Sized > ( & self , _: & Type , w : & mut W ) -> Result < ( ) , Error > {
219
- // use LE
220
- try!( w. write_u8 ( 0x01 ) ) ;
221
- try!( w. write_u32 :: < LittleEndian > ( Self :: type_id ( ) ) ) ;
222
- Self :: opt_srid ( ) . map ( |srid| w. write_i32 :: < LittleEndian > ( srid) ) ;
223
- try!( self . write_ewkb_body ( w) ) ;
224
- Ok ( ( ) )
225
- }
223
+ fn write_ewkb < W : Write +?Sized > ( & self , _: & Type , w : & mut W ) -> Result < ( ) , Error > {
224
+ // use LE
225
+ try!( w. write_u8 ( 0x01 ) ) ;
226
+ try!( w. write_u32 :: < LittleEndian > ( Self :: type_id ( ) ) ) ;
227
+ Self :: opt_srid ( ) . map ( |srid| w. write_i32 :: < LittleEndian > ( srid) ) ;
228
+ try!( self . write_ewkb_body ( w) ) ;
229
+ Ok ( ( ) )
230
+ }
226
231
227
- fn write_ewkb_body < W : Write +?Sized > ( & self , w : & mut W ) -> Result < ( ) , Error > {
228
- // lol
229
- let x = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) } ;
230
- let y = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) . offset ( 1 ) } ;
231
- try!( w. write_f64 :: < LittleEndian > ( x) ) ;
232
- try!( w. write_f64 :: < LittleEndian > ( y) ) ;
233
- self . opt_z ( ) . map ( |z| w. write_f64 :: < LittleEndian > ( z) ) ;
234
- self . opt_m ( ) . map ( |m| w. write_f64 :: < LittleEndian > ( m) ) ;
235
- Ok ( ( ) )
236
- }
232
+ fn write_ewkb_body < W : Write +?Sized > ( & self , w : & mut W ) -> Result < ( ) , Error > {
233
+ // lol
234
+ let x = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) } ;
235
+ let y = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) . offset ( 1 ) } ;
236
+ try!( w. write_f64 :: < LittleEndian > ( x) ) ;
237
+ try!( w. write_f64 :: < LittleEndian > ( y) ) ;
238
+ self . opt_z ( ) . map ( |z| w. write_f64 :: < LittleEndian > ( z) ) ;
239
+ self . opt_m ( ) . map ( |m| w. write_f64 :: < LittleEndian > ( m) ) ;
240
+ Ok ( ( ) )
241
+ }
237
242
238
- fn describ ( & self ) -> String {
239
- let mut ret = "POINT" . to_string ( ) ;
240
- self . opt_z ( ) . map ( |_| ret. push_str ( "Z" ) ) ;
241
- self . opt_m ( ) . map ( |_| ret. push_str ( "M" ) ) ;
242
- // lol
243
- let x = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) } ;
244
- let y = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) . offset ( 1 ) } ;
245
- ret. push_str ( & format ! ( "({} {}" , x, y) ) ;
246
- self . opt_z ( ) . map ( |z| ret. push_str ( & format ! ( " {}" , z) ) ) ;
247
- self . opt_m ( ) . map ( |m| ret. push_str ( & format ! ( " {}" , m) ) ) ;
248
- ret. push_str ( ")" ) ;
249
- ret
243
+ fn describ ( & self ) -> String {
244
+ let mut ret = "POINT" . to_string ( ) ;
245
+ self . opt_z ( ) . map ( |_| ret. push_str ( "Z" ) ) ;
246
+ self . opt_m ( ) . map ( |_| ret. push_str ( "M" ) ) ;
247
+ // lol
248
+ let x = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) } ;
249
+ let y = unsafe { * mem:: transmute :: < _ , * const f64 > ( self ) . offset ( 1 ) } ;
250
+ ret. push_str ( & format ! ( "({} {}" , x, y) ) ;
251
+ self . opt_z ( ) . map ( |z| ret. push_str ( & format ! ( " {}" , z) ) ) ;
252
+ self . opt_m ( ) . map ( |m| ret. push_str ( & format ! ( " {}" , m) ) ) ;
253
+ ret. push_str ( ")" ) ;
254
+ ret
255
+ }
250
256
}
251
257
}
258
+ use detail:: ToPoint ;
252
259
253
260
#[ derive( Copy , Clone ) ]
254
261
pub struct Point < S : SRID = WGS84 > {
0 commit comments