Just thinking:  I know you've spent a lot of time on this (and thanks for
doing so), but is Array really being used just to pass two values?  I
wonder if it would be better to use Point.

On 11/4/13 12:55 AM, "mamsel...@apache.org" <mamsel...@apache.org> wrote:

>Updated Branches:
>  refs/heads/develop 5c9baf119 -> 7cab71bb2
>
>
>FIX - FLEX-33865 ConstraintLayout optimization
>
>
>Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
>Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/7cab71bb
>Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/7cab71bb
>Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/7cab71bb
>
>Branch: refs/heads/develop
>Commit: 7cab71bb2192390dceaa4cc4c07eb45f49a4f5c7
>Parents: 5c9baf1
>Author: mamsellem <maurice.amsel...@systar.com>
>Authored: Mon Nov 4 09:52:05 2013 +0100
>Committer: mamsellem <maurice.amsel...@systar.com>
>Committed: Mon Nov 4 09:52:05 2013 +0100
>
>----------------------------------------------------------------------
> .../spark/src/spark/layouts/ConstraintLayout.as | 17 ++---
> .../supportClasses/LayoutElementHelper.as       | 78 ++++++++++++++++----
> 2 files changed, 72 insertions(+), 23 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/frameworks/p
>rojects/spark/src/spark/layouts/ConstraintLayout.as
>----------------------------------------------------------------------
>diff --git 
>a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>index c7d47a6..60ef4cd 100644
>--- a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>+++ b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>@@ -605,7 +605,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintColumns:Vector.<ConstraintColumn> =
>this.constraintColumns;
>+        var constraintColumns:Vector.<ConstraintColumn> =
>this._constraintColumns;
>         var numCols:int = constraintColumns.length;
>         var totalWidth:Number = 0;
>         
>@@ -626,7 +626,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintRows:Vector.<ConstraintRow> = this.constraintRows;
>+        var constraintRows:Vector.<ConstraintRow> = this._constraintRows;
>         var numRows:int = constraintRows.length;
>         var totalHeight:Number = 0;
>         
>@@ -1669,24 +1669,23 @@ public class ConstraintLayout extends LayoutBase
>         
>         var message:String;
>         
>-        var temp:Array;
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>+        var temp:Array =
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>         left = temp[0];
>         leftBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right);
>+        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right, temp);
>         right = temp[0];
>         rightBoundary = temp[1];
>         
>-        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top);
>+        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top,
>temp);
>         top = temp[0];
>         topBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom);
>+        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom, temp);
>         bottom = temp[0];
>         bottomBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline);
>+        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline, temp);
>         baseline = temp[0];
>         baselineBoundary = temp[1];
>         
>@@ -1938,4 +1937,4 @@ import mx.containers.utilityClasses.FlexChildInfo;
> class ConstraintRegionFlexChildInfo extends FlexChildInfo
> {
>     public var index:int
>-}
>\ No newline at end of file
>+}
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/frameworks/p
>rojects/spark/src/spark/layouts/supportClasses/LayoutElementHelper.as
>----------------------------------------------------------------------
>diff --git 
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as
>index baab217..d8eac93 100644
>--- 
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as
>+++ 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as
>@@ -19,6 +19,7 @@
> 
> package spark.layouts.supportClasses
> {
>+import mx.utils.StringUtil;
> 
> [ExcludeClass]
> 
>@@ -79,28 +80,77 @@ public class LayoutElementHelper
>      *  so that an array is returned where the first value is
>      *  the offset (ie: 10) and the second value is
>      *  the boundary (ie: "col1")
>+     *  @arg result :  optional Array to save an Array memory allocation
>      */
>-    public static function parseConstraintExp(val:Object):Array
>+    public static function parseConstraintExp(val:Object,
>result:Array=null):Array
>     {
>-        if (val is Number)
>-            return [Number(val), null];
>-        
>-        if (!val)
>-            return [NaN, null];
>-        // Replace colons with spaces
>-        var temp:String = String(val).replace(/:/g, " ");
>-        
>-        // Split the string into an array
>-        var args:Array = temp.split(/\s+/);
>+        // number
>+        if (val is Number) {
>+            if(result == null) {
>+                return [val as Number, null];
>+            }
>+            else {
>+                result[0] = val as Number;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+       // null
>+        if (!val) {
>+            if(result == null) {
>+                return [NaN, null];
>+            }
>+            else {
>+                result[0] = NaN;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+
>+        // String case  : 2 sub-cases, number of constraint
>+        var tmp:String = String(val);
>+        var colonPos:int = tmp.indexOf(":");
>         
>         // If the val was a String object representing a single number
>(i.e. "100"),
>         // then we'll hit this case:
>-        if (args.length == 1)
>-            return args;
>+        if(colonPos == -1) {
>+            return [StringUtil.trim(tmp)];
>+        }
>         
>         // Return [offset, boundary]
>-        return [args[1], args[0]];
>+        if(result == null) {
>+            result =[];
>+        }
>+        
>+        //here we do not use StringUtil in order to avoid unnecessary
>memory allocations
>+        var startIndex:int = 0;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndex))) {
>+            ++startIndex;
>+        }
>+        
>+        var endIndex:int = tmp.length - 1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndex) )) {
>+            --endIndex;
>+        }
>+        
>+        var endIndexPart1:int = colonPos-1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndexPart1))) {
>+            --endIndexPart1;
>+        }
>+        
>+        var startIndexPart2:int = colonPos+1;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndexPart2))) {
>+            ++startIndexPart2;
>+        }
>+        
>+        result[0] = tmp.substring(startIndexPart2, endIndex+1);
>+        result[1] = tmp.substring(startIndex, endIndexPart1+1);
>+        
>+        return result;
>     }
>+
>+
>+
> }
> 
> }
>

Reply via email to