@@ -80,6 +80,10 @@ use std::default::Default;
8080use std:: fmt;
8181use std:: str:: FromStr ;
8282
83+ use geo_traits:: {
84+ GeometryCollectionTrait , GeometryTrait , LineStringTrait , MultiLineStringTrait , MultiPointTrait ,
85+ MultiPolygonTrait , PointTrait , PolygonTrait ,
86+ } ;
8387use num_traits:: { Float , Num , NumCast } ;
8488
8589use crate :: tokenizer:: { PeekableTokens , Token , Tokens } ;
@@ -397,6 +401,196 @@ where
397401 }
398402}
399403
404+ impl < T : WktNum > GeometryTrait for Wkt < T > {
405+ type T = T ;
406+ type PointType < ' b > = Point < T > where Self : ' b ;
407+ type LineStringType < ' b > = LineString < T > where Self : ' b ;
408+ type PolygonType < ' b > = Polygon < T > where Self : ' b ;
409+ type MultiPointType < ' b > = MultiPoint < T > where Self : ' b ;
410+ type MultiLineStringType < ' b > = MultiLineString < T > where Self : ' b ;
411+ type MultiPolygonType < ' b > = MultiPolygon < T > where Self : ' b ;
412+ type GeometryCollectionType < ' b > = GeometryCollection < T > where Self : ' b ;
413+ type RectType < ' b > = geo_traits:: UnimplementedRect < T > where Self : ' b ;
414+ type LineType < ' b > = geo_traits:: UnimplementedLine < T > where Self : ' b ;
415+ type TriangleType < ' b > = geo_traits:: UnimplementedTriangle < T > where Self : ' b ;
416+
417+ fn dim ( & self ) -> geo_traits:: Dimensions {
418+ match self {
419+ Wkt :: Point ( geom) => PointTrait :: dim ( geom) ,
420+ Wkt :: LineString ( geom) => LineStringTrait :: dim ( geom) ,
421+ Wkt :: Polygon ( geom) => PolygonTrait :: dim ( geom) ,
422+ Wkt :: MultiPoint ( geom) => MultiPointTrait :: dim ( geom) ,
423+ Wkt :: MultiLineString ( geom) => MultiLineStringTrait :: dim ( geom) ,
424+ Wkt :: MultiPolygon ( geom) => MultiPolygonTrait :: dim ( geom) ,
425+ Wkt :: GeometryCollection ( geom) => GeometryCollectionTrait :: dim ( geom) ,
426+ }
427+ }
428+
429+ fn as_type (
430+ & self ,
431+ ) -> geo_traits:: GeometryType <
432+ ' _ ,
433+ Point < T > ,
434+ LineString < T > ,
435+ Polygon < T > ,
436+ MultiPoint < T > ,
437+ MultiLineString < T > ,
438+ MultiPolygon < T > ,
439+ GeometryCollection < T > ,
440+ Self :: RectType < ' _ > ,
441+ Self :: TriangleType < ' _ > ,
442+ Self :: LineType < ' _ > ,
443+ > {
444+ match self {
445+ Wkt :: Point ( geom) => geo_traits:: GeometryType :: Point ( geom) ,
446+ Wkt :: LineString ( geom) => geo_traits:: GeometryType :: LineString ( geom) ,
447+ Wkt :: Polygon ( geom) => geo_traits:: GeometryType :: Polygon ( geom) ,
448+ Wkt :: MultiPoint ( geom) => geo_traits:: GeometryType :: MultiPoint ( geom) ,
449+ Wkt :: MultiLineString ( geom) => geo_traits:: GeometryType :: MultiLineString ( geom) ,
450+ Wkt :: MultiPolygon ( geom) => geo_traits:: GeometryType :: MultiPolygon ( geom) ,
451+ Wkt :: GeometryCollection ( geom) => geo_traits:: GeometryType :: GeometryCollection ( geom) ,
452+ }
453+ }
454+ }
455+
456+ impl < T : WktNum > GeometryTrait for & Wkt < T > {
457+ type T = T ;
458+ type PointType < ' b > = Point < T > where Self : ' b ;
459+ type LineStringType < ' b > = LineString < T > where Self : ' b ;
460+ type PolygonType < ' b > = Polygon < T > where Self : ' b ;
461+ type MultiPointType < ' b > = MultiPoint < T > where Self : ' b ;
462+ type MultiLineStringType < ' b > = MultiLineString < T > where Self : ' b ;
463+ type MultiPolygonType < ' b > = MultiPolygon < T > where Self : ' b ;
464+ type GeometryCollectionType < ' b > = GeometryCollection < T > where Self : ' b ;
465+ type RectType < ' b > = geo_traits:: UnimplementedRect < T > where Self : ' b ;
466+ type LineType < ' b > = geo_traits:: UnimplementedLine < T > where Self : ' b ;
467+ type TriangleType < ' b > = geo_traits:: UnimplementedTriangle < T > where Self : ' b ;
468+
469+ fn dim ( & self ) -> geo_traits:: Dimensions {
470+ match self {
471+ Wkt :: Point ( geom) => PointTrait :: dim ( geom) ,
472+ Wkt :: LineString ( geom) => LineStringTrait :: dim ( geom) ,
473+ Wkt :: Polygon ( geom) => PolygonTrait :: dim ( geom) ,
474+ Wkt :: MultiPoint ( geom) => MultiPointTrait :: dim ( geom) ,
475+ Wkt :: MultiLineString ( geom) => MultiLineStringTrait :: dim ( geom) ,
476+ Wkt :: MultiPolygon ( geom) => MultiPolygonTrait :: dim ( geom) ,
477+ Wkt :: GeometryCollection ( geom) => GeometryCollectionTrait :: dim ( geom) ,
478+ }
479+ }
480+
481+ fn as_type (
482+ & self ,
483+ ) -> geo_traits:: GeometryType <
484+ ' _ ,
485+ Point < T > ,
486+ LineString < T > ,
487+ Polygon < T > ,
488+ MultiPoint < T > ,
489+ MultiLineString < T > ,
490+ MultiPolygon < T > ,
491+ GeometryCollection < T > ,
492+ Self :: RectType < ' _ > ,
493+ Self :: TriangleType < ' _ > ,
494+ Self :: LineType < ' _ > ,
495+ > {
496+ match self {
497+ Wkt :: Point ( geom) => geo_traits:: GeometryType :: Point ( geom) ,
498+ Wkt :: LineString ( geom) => geo_traits:: GeometryType :: LineString ( geom) ,
499+ Wkt :: Polygon ( geom) => geo_traits:: GeometryType :: Polygon ( geom) ,
500+ Wkt :: MultiPoint ( geom) => geo_traits:: GeometryType :: MultiPoint ( geom) ,
501+ Wkt :: MultiLineString ( geom) => geo_traits:: GeometryType :: MultiLineString ( geom) ,
502+ Wkt :: MultiPolygon ( geom) => geo_traits:: GeometryType :: MultiPolygon ( geom) ,
503+ Wkt :: GeometryCollection ( geom) => geo_traits:: GeometryType :: GeometryCollection ( geom) ,
504+ }
505+ }
506+ }
507+
508+ // Specialized implementations on each WKT concrete type.
509+
510+ macro_rules! impl_specialization {
511+ ( $geometry_type: ident) => {
512+ impl <T : WktNum > GeometryTrait for $geometry_type<T > {
513+ type T = T ;
514+ type PointType <' b> = Point <Self :: T > where Self : ' b;
515+ type LineStringType <' b> = LineString <Self :: T > where Self : ' b;
516+ type PolygonType <' b> = Polygon <Self :: T > where Self : ' b;
517+ type MultiPointType <' b> = MultiPoint <Self :: T > where Self : ' b;
518+ type MultiLineStringType <' b> = MultiLineString <Self :: T > where Self : ' b;
519+ type MultiPolygonType <' b> = MultiPolygon <Self :: T > where Self : ' b;
520+ type GeometryCollectionType <' b> = GeometryCollection <Self :: T > where Self : ' b;
521+ type RectType <' b> = geo_traits:: UnimplementedRect <T > where Self : ' b;
522+ type LineType <' b> = geo_traits:: UnimplementedLine <T > where Self : ' b;
523+ type TriangleType <' b> = geo_traits:: UnimplementedTriangle <T > where Self : ' b;
524+
525+ fn dim( & self ) -> geo_traits:: Dimensions {
526+ geo_traits:: Dimensions :: Xy
527+ }
528+
529+ fn as_type(
530+ & self ,
531+ ) -> geo_traits:: GeometryType <
532+ ' _,
533+ Point <T >,
534+ LineString <T >,
535+ Polygon <T >,
536+ MultiPoint <T >,
537+ MultiLineString <T >,
538+ MultiPolygon <T >,
539+ GeometryCollection <T >,
540+ Self :: RectType <' _>,
541+ Self :: TriangleType <' _>,
542+ Self :: LineType <' _>,
543+ > {
544+ geo_traits:: GeometryType :: $geometry_type( self )
545+ }
546+ }
547+
548+ impl <' a, T : WktNum + ' a> GeometryTrait for & ' a $geometry_type<T > {
549+ type T = T ;
550+ type PointType <' b> = Point <Self :: T > where Self : ' b;
551+ type LineStringType <' b> = LineString <Self :: T > where Self : ' b;
552+ type PolygonType <' b> = Polygon <Self :: T > where Self : ' b;
553+ type MultiPointType <' b> = MultiPoint <Self :: T > where Self : ' b;
554+ type MultiLineStringType <' b> = MultiLineString <Self :: T > where Self : ' b;
555+ type MultiPolygonType <' b> = MultiPolygon <Self :: T > where Self : ' b;
556+ type GeometryCollectionType <' b> = GeometryCollection <Self :: T > where Self : ' b;
557+ type RectType <' b> = geo_traits:: UnimplementedRect <T > where Self : ' b;
558+ type LineType <' b> = geo_traits:: UnimplementedLine <T > where Self : ' b;
559+ type TriangleType <' b> = geo_traits:: UnimplementedTriangle <T > where Self : ' b;
560+
561+ fn dim( & self ) -> geo_traits:: Dimensions {
562+ geo_traits:: Dimensions :: Xy
563+ }
564+
565+ fn as_type(
566+ & self ,
567+ ) -> geo_traits:: GeometryType <
568+ ' _,
569+ Point <T >,
570+ LineString <T >,
571+ Polygon <T >,
572+ MultiPoint <T >,
573+ MultiLineString <T >,
574+ MultiPolygon <T >,
575+ GeometryCollection <T >,
576+ Self :: RectType <' _>,
577+ Self :: TriangleType <' _>,
578+ Self :: LineType <' _>,
579+ > {
580+ geo_traits:: GeometryType :: $geometry_type( self )
581+ }
582+ }
583+ } ;
584+ }
585+
586+ impl_specialization ! ( Point ) ;
587+ impl_specialization ! ( LineString ) ;
588+ impl_specialization ! ( Polygon ) ;
589+ impl_specialization ! ( MultiPoint ) ;
590+ impl_specialization ! ( MultiLineString ) ;
591+ impl_specialization ! ( MultiPolygon ) ;
592+ impl_specialization ! ( GeometryCollection ) ;
593+
400594fn infer_geom_dimension < T : WktNum + FromStr + Default > (
401595 tokens : & mut PeekableTokens < T > ,
402596) -> Result < Dimension , & ' static str > {
0 commit comments