@@ -587,6 +587,12 @@ virtual public MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mr
587587 {
588588 return null ;
589589 }
590+
591+ virtual public ExpressionDrawer . IDrawable DrawableFromMemory ( MemoryReader . Converter < double > converter ,
592+ double [ ] values , int offset )
593+ {
594+ return null ;
595+ }
590596 }
591597
592598 /// <summary>
@@ -622,13 +628,60 @@ virtual public ExpressionDrawer.Point LoadPoint(MemoryReader mreader, Debugger d
622628 }
623629 abstract protected ExpressionDrawer . Point LoadPointParsed ( Debugger debugger , string name , string type ) ;
624630 abstract protected ExpressionDrawer . Point LoadPointMemory ( MemoryReader mreader , Debugger debugger , string name , string type ) ;
631+
632+ public override ExpressionDrawer . IDrawable DrawableFromMemory ( MemoryReader . Converter < double > converter ,
633+ double [ ] values , int offset )
634+ {
635+ int valCount = converter . ValueCount ( ) ;
636+ return valCount >= 2 ? new ExpressionDrawer . Point ( values [ offset ] , values [ offset + 1 ] )
637+ : valCount == 1 ? new ExpressionDrawer . Point ( values [ offset ] , 0 )
638+ : null ;
639+ }
625640 }
626641
627642 abstract class BoxLoader : GeometryLoader < ExpressionDrawer . Box >
628- { }
643+ {
644+ public override ExpressionDrawer . IDrawable DrawableFromMemory ( MemoryReader . Converter < double > converter ,
645+ double [ ] values , int offset )
646+ {
647+ int valCount = converter . ValueCount ( ) ;
648+ if ( valCount == 4 )
649+ {
650+ var mi = new ExpressionDrawer . Point ( values [ offset ] , values [ offset + 1 ] ) ;
651+ var ma = new ExpressionDrawer . Point ( values [ offset + 2 ] , values [ offset + 3 ] ) ;
652+ return new ExpressionDrawer . Box ( mi , ma ) ;
653+ }
654+ else if ( valCount == 2 )
655+ {
656+ var mi = new ExpressionDrawer . Point ( values [ offset ] , 0 ) ;
657+ var ma = new ExpressionDrawer . Point ( values [ offset + 1 ] , 0 ) ;
658+ return new ExpressionDrawer . Box ( mi , ma ) ;
659+ }
660+ return null ;
661+ }
662+ }
629663
630664 abstract class SegmentLoader : GeometryLoader < ExpressionDrawer . Segment >
631- { }
665+ {
666+ public override ExpressionDrawer . IDrawable DrawableFromMemory ( MemoryReader . Converter < double > converter ,
667+ double [ ] values , int offset )
668+ {
669+ int valCount = converter . ValueCount ( ) ;
670+ if ( valCount == 4 )
671+ {
672+ var p0 = new ExpressionDrawer . Point ( values [ offset ] , values [ offset + 1 ] ) ;
673+ var p1 = new ExpressionDrawer . Point ( values [ offset + 2 ] , values [ offset + 3 ] ) ;
674+ return new ExpressionDrawer . Segment ( p0 , p1 ) ;
675+ }
676+ else if ( valCount == 2 )
677+ {
678+ var p0 = new ExpressionDrawer . Point ( values [ offset ] , 0 ) ;
679+ var p1 = new ExpressionDrawer . Point ( values [ offset + 1 ] , 0 ) ;
680+ return new ExpressionDrawer . Segment ( p0 , p1 ) ;
681+ }
682+ return null ;
683+ }
684+ }
632685
633686 abstract class NSphereLoader : GeometryLoader < ExpressionDrawer . NSphere >
634687 { }
@@ -663,9 +716,9 @@ protected override ExpressionDrawer.Point LoadPointParsed(Debugger debugger, str
663716 bool okx = true , oky = true ;
664717 double x = 0 , y = 0 ;
665718 string ptrName = name + memberArraySuffix ;
666- if ( count > 0 )
719+ if ( count >= 1 )
667720 okx = ExpressionParser . TryLoadDouble ( debugger , ptrName + "[0]" , out x ) ;
668- if ( count > 1 )
721+ if ( count >= 2 )
669722 oky = ExpressionParser . TryLoadDouble ( debugger , ptrName + "[1]" , out y ) ;
670723 return Util . IsOk ( okx , oky )
671724 ? new ExpressionDrawer . Point ( x , y )
@@ -683,12 +736,12 @@ protected override ExpressionDrawer.Point LoadPointMemory(MemoryReader mreader,
683736 double [ ] values = new double [ count ] ;
684737 if ( mreader . ReadNumericArray ( info . Address , info . Type , info . Size , values ) )
685738 {
686- if ( count > 1 )
739+ if ( count >= 2 )
687740 return new ExpressionDrawer . Point ( values [ 0 ] , values [ 1 ] ) ;
688- else if ( count > 0 )
741+ else if ( count == 1 )
689742 return new ExpressionDrawer . Point ( values [ 0 ] , 0 ) ;
690743 else
691- return new ExpressionDrawer . Point ( 0 , 0 ) ;
744+ return null ;
692745 }
693746
694747 return null ;
@@ -704,6 +757,8 @@ public override MemoryReader.Converter<double> GetMemoryConverter(MemoryReader m
704757 int elemSize = ExpressionParser . GetTypeSizeof ( debugger , coordType ) ;
705758 MemoryReader . Converter < double > arrayConverter
706759 = mreader . GetNumericArrayConverter ( coordType , elemSize , count ) ;
760+ if ( arrayConverter == null )
761+ return null ;
707762 int byteSize = ( new ExpressionParser ( debugger ) ) . GetValueSizeof ( name ) ;
708763 if ( byteSize == 0 )
709764 return null ;
@@ -884,6 +939,8 @@ public override MemoryReader.Converter<double> GetMemoryConverter(MemoryReader m
884939 string m_max_corner = name + ".m_max_corner" ;
885940
886941 MemoryReader . Converter < double > pointConverter = pointLoader . GetMemoryConverter ( mreader , debugger , m_min_corner , pointType ) ;
942+ if ( pointConverter == null )
943+ return null ;
887944
888945 return new MemoryReader . StructConverter < double > ( sizeOf ,
889946 new MemoryReader . Member < double > ( pointConverter , ( int ) minDiff ) ,
@@ -913,21 +970,35 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
913970 return null ;
914971
915972 string first = name + ".first" ;
973+ string second = name + ".second" ;
974+
916975 string pointType = tparams [ 0 ] ;
917976 PointLoader pointLoader = loaders . FindByType ( ExpressionLoader . Kind . Point ,
918977 first ,
919978 pointType ) as PointLoader ;
920979 if ( pointLoader == null )
921980 return null ;
922981
923- return new BGSegment ( pointLoader , pointType ) ;
982+ int sizeOf = ExpressionParser . GetTypeSizeof ( debugger , type ) ;
983+ if ( ExpressionParser . IsInvalidSize ( sizeOf ) )
984+ return null ;
985+
986+ long firstDiff = ExpressionParser . GetAddressDifference ( debugger , name , first ) ;
987+ long secondDiff = ExpressionParser . GetAddressDifference ( debugger , name , second ) ;
988+ if ( ExpressionParser . IsInvalidOffset ( sizeOf , firstDiff , secondDiff ) )
989+ return null ;
990+
991+ return new BGSegment ( pointLoader , pointType , sizeOf , firstDiff , secondDiff ) ;
924992 }
925993 }
926994
927- protected BGSegment ( PointLoader pointLoader , string pointType )
995+ protected BGSegment ( PointLoader pointLoader , string pointType , int sizeOf , long firstDiff , long secondDiff )
928996 {
929997 this . pointLoader = pointLoader ;
930998 this . pointType = pointType ;
999+ this . sizeOf = sizeOf ;
1000+ this . firstDiff = firstDiff ;
1001+ this . secondDiff = secondDiff ;
9311002 }
9321003
9331004 public override Geometry . Traits GetTraits ( MemoryReader mreader , Debugger debugger ,
@@ -951,10 +1022,32 @@ public override ExpressionDrawer.IDrawable Load(MemoryReader mreader, Debugger d
9511022 : null ;
9521023 }
9531024
954- // TODO: GetMemoryConverter
1025+ public override MemoryReader . Converter < double > GetMemoryConverter ( MemoryReader mreader ,
1026+ Debugger debugger , // TODO - remove
1027+ string name , string type )
1028+ {
1029+ // NOTE: Because it can be created by derived class
1030+ // and these members can be set to invalid values
1031+ // e.g. BGReferringSegment
1032+ if ( ExpressionParser . IsInvalidSize ( sizeOf )
1033+ || ExpressionParser . IsInvalidOffset ( sizeOf , firstDiff , secondDiff ) )
1034+ return null ;
1035+
1036+ string first = name + ".first" ;
1037+ MemoryReader . Converter < double > pointConverter = pointLoader . GetMemoryConverter ( mreader , debugger , first , pointType ) ;
1038+ if ( pointConverter == null )
1039+ return null ;
1040+
1041+ return new MemoryReader . StructConverter < double > ( sizeOf ,
1042+ new MemoryReader . Member < double > ( pointConverter , ( int ) firstDiff ) ,
1043+ new MemoryReader . Member < double > ( pointConverter , ( int ) secondDiff ) ) ;
1044+ }
9551045
9561046 PointLoader pointLoader ;
9571047 string pointType ;
1048+ long firstDiff ;
1049+ long secondDiff ;
1050+ int sizeOf ;
9581051 }
9591052
9601053 class BGReferringSegment : BGSegment
@@ -977,15 +1070,13 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
9771070 PointLoader pointLoader = loaders . FindByType ( ExpressionLoader . Kind . Point ,
9781071 first ,
9791072 pointType ) as PointLoader ;
980- if ( pointLoader == null )
981- return null ;
9821073
9831074 return new BGReferringSegment ( pointLoader , pointType ) ;
9841075 }
9851076 }
9861077
9871078 private BGReferringSegment ( PointLoader pointLoader , string pointType )
988- : base ( pointLoader , pointType )
1079+ : base ( pointLoader , pointType , 0 , - 1 , - 1 )
9891080 { }
9901081 }
9911082
@@ -1087,15 +1178,15 @@ protected ResultType LoadMemory(MemoryReader mreader,
10871178 ContainerLoader containerLoader ,
10881179 LoadCallback callback )
10891180 {
1090- ResultType result = null ;
1181+ MemoryReader . Converter < double > pointConverter = pointLoader . GetMemoryConverter (
1182+ mreader , debugger , pointName , pointType ) ;
1183+ if ( pointConverter == null )
1184+ return null ;
10911185
1092- MemoryReader . Converter < double > pointConverter = pointLoader . GetMemoryConverter ( mreader , debugger ,
1093- pointName , pointType ) ;
1094- if ( pointConverter != null )
1095- {
1096- int dimension = pointConverter . ValueCount ( ) ;
1097- result = new ResultType ( ) ;
1098- bool ok = containerLoader . ForEachMemoryBlock ( mreader , debugger , name , type , 0 , pointConverter ,
1186+ int dimension = pointConverter . ValueCount ( ) ;
1187+ ResultType result = new ResultType ( ) ;
1188+ if ( containerLoader . ForEachMemoryBlock ( mreader , debugger ,
1189+ name , type , 0 , pointConverter ,
10991190 delegate ( double [ ] values )
11001191 {
11011192 if ( dimension == 0 || values . Length % dimension != 0 )
@@ -1112,12 +1203,12 @@ protected ResultType LoadMemory(MemoryReader mreader,
11121203 }
11131204
11141205 return callback ( ) ;
1115- } ) ;
1116- if ( ! ok )
1117- result = null ;
1206+ } ) )
1207+ {
1208+ return result ;
11181209 }
11191210
1120- return result ;
1211+ return null ;
11211212 }
11221213 }
11231214
@@ -2565,23 +2656,23 @@ protected override ExpressionDrawer.Point LoadPointParsed(Debugger debugger, str
25652656 protected override ExpressionDrawer . Point LoadPointMemory ( MemoryReader mreader , Debugger debugger ,
25662657 string name , string type )
25672658 {
2568- // TODO: Memory converter could be calculated once
25692659 MemoryReader . Converter < double > converter = GetMemoryConverter ( mreader , debugger , name , type ) ;
2570- if ( converter != null )
2571- {
2572- if ( converter . ValueCount ( ) != 2 )
2573- throw new ArgumentOutOfRangeException ( "converter.ValueCount()" ) ;
2660+ if ( converter == null )
2661+ return null ;
25742662
2575- ulong address = ExpressionParser . GetValueAddress ( debugger , name ) ;
2576- if ( address == 0 )
2577- return null ;
2663+ if ( converter . ValueCount ( ) != 2 )
2664+ throw new ArgumentOutOfRangeException ( "converter.ValueCount()" ) ;
25782665
2579- double [ ] values = new double [ 2 ] ;
2580- if ( mreader . Read ( address , values , converter ) )
2581- {
2582- return new ExpressionDrawer . Point ( values [ 0 ] , values [ 1 ] ) ;
2583- }
2666+ ulong address = ExpressionParser . GetValueAddress ( debugger , name ) ;
2667+ if ( address == 0 )
2668+ return null ;
2669+
2670+ double [ ] values = new double [ 2 ] ;
2671+ if ( mreader . Read ( address , values , converter ) )
2672+ {
2673+ return new ExpressionDrawer . Point ( values [ 0 ] , values [ 1 ] ) ;
25842674 }
2675+
25852676 return null ;
25862677 }
25872678
@@ -2871,20 +2962,90 @@ public override Geometry.Traits GetTraits(MemoryReader mreader, Debugger debugge
28712962 public override ExpressionDrawer . IDrawable Load ( MemoryReader mreader , Debugger debugger ,
28722963 string name , string type ,
28732964 LoadCallback callback )
2965+ {
2966+ ExpressionDrawer . DrawablesContainer result = null ;
2967+
2968+ if ( mreader != null )
2969+ {
2970+ string geometryName , dummyType ;
2971+ containerLoader . ElementInfo ( name , type , out geometryName , out dummyType ) ;
2972+
2973+ result = LoadMemory ( mreader , debugger ,
2974+ name , type ,
2975+ geometryName ,
2976+ callback ) ;
2977+ }
2978+
2979+ if ( result == null )
2980+ {
2981+ result = LoadParsed ( mreader , debugger , name , type , callback ) ;
2982+ }
2983+
2984+ return result ;
2985+ }
2986+
2987+ private ExpressionDrawer . DrawablesContainer LoadMemory ( MemoryReader mreader , Debugger debugger ,
2988+ string name , string type ,
2989+ string geometryName ,
2990+ LoadCallback callback )
2991+ {
2992+ MemoryReader . Converter < double > geometryConverter = geometryLoader . GetMemoryConverter (
2993+ mreader , debugger , geometryName , geometryType ) ;
2994+
2995+ if ( geometryConverter == null )
2996+ return null ;
2997+
2998+ ExpressionDrawer . DrawablesContainer result = new ExpressionDrawer . DrawablesContainer ( ) ;
2999+ if ( containerLoader . ForEachMemoryBlock ( mreader , debugger ,
3000+ name , type , 0 , geometryConverter ,
3001+ delegate ( double [ ] values )
3002+ {
3003+ int valCount = geometryConverter . ValueCount ( ) ;
3004+ if ( valCount == 0 || values . Length % valCount != 0 )
3005+ return false ;
3006+ int geometriesCount = values . Length / valCount ;
3007+
3008+ for ( int i = 0 ; i < geometriesCount ; ++ i )
3009+ {
3010+ ExpressionDrawer . IDrawable d = geometryLoader . DrawableFromMemory (
3011+ geometryConverter , values , i * valCount ) ;
3012+
3013+ if ( d == null )
3014+ return false ;
3015+
3016+ result . Add ( d ) ;
3017+ }
3018+
3019+ return callback ( ) ;
3020+ } ) )
3021+ {
3022+ return result ;
3023+ }
3024+
3025+ return null ;
3026+ }
3027+
3028+ private ExpressionDrawer . DrawablesContainer LoadParsed ( MemoryReader mreader , Debugger debugger ,
3029+ string name , string type ,
3030+ LoadCallback callback )
28743031 {
28753032 ExpressionDrawer . DrawablesContainer drawables = new ExpressionDrawer . DrawablesContainer ( ) ;
2876- bool ok = containerLoader . ForEachElement ( debugger , name , delegate ( string elName )
3033+ if ( containerLoader . ForEachElement ( debugger , name ,
3034+ delegate ( string elName )
3035+ {
3036+ ExpressionDrawer . IDrawable drawable = geometryLoader . Load (
3037+ mreader , debugger , elName , geometryType , callback ) ;
3038+ if ( drawable == null )
3039+ return false ;
3040+ drawables . Add ( drawable ) ;
3041+ //return callback();
3042+ return true ;
3043+ } ) )
28773044 {
2878- ExpressionDrawer . IDrawable drawable = geometryLoader . Load ( mreader , debugger ,
2879- elName , geometryType ,
2880- callback ) ;
2881- if ( drawable == null )
2882- return false ;
2883- drawables . Add ( drawable ) ;
2884- //return callback();
2885- return true ;
2886- } ) ;
2887- return ok ? drawables : null ;
3045+ return drawables ;
3046+ }
3047+
3048+ return null ;
28883049 }
28893050
28903051 ContainerLoader containerLoader ;
0 commit comments