2006-01-12 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Thu, 12 Jan 2006 15:53:04 +0000 (15:53 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 12 Jan 2006 15:53:04 +0000 (15:53 -0000)
* RdpPattern.cs :
  Introduced EmptyTextDeriv() so that the results could be memoized.

* RelaxngValidatingReader.cs : Use RdpPattern.EmptyTextDeriv(). It
  significantly improves performance wrt empty text nodes.

svn path=/trunk/mcs/; revision=55432

mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/ChangeLog
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng.Derivative/RdpPatterns.cs
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs

index b218e3cf4510b328e3922eb9ba4cc1d9db8cd8d3..08b2e0e3e2471f4f61f13c62df9515c1304c706a 100644 (file)
@@ -1,3 +1,8 @@
+2006-01-12  Atsushi Enomoto <atsushi@ximian.com>
+
+       * RdpPattern.cs :
+         Introduced EmptyTextDeriv() so that the results could be memoized.
+
 2006-01-10  Atsushi Enomoto <atsushi@ximian.com>
 
        * RdpPatterns.cs :
index 0463d4cc103b8f8cce52bcdb3c1b99bb93c7f964..3a7d64732fae98fb07d025c21a30b65ada6de7d0 100644 (file)
@@ -326,6 +326,11 @@ namespace Commons.Xml.Relaxng.Derivative
                        return RdpNotAllowed.Instance;
                }
 
+               internal virtual RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return TextDeriv (String.Empty, null);
+               }
+
                internal virtual RdpPattern TextOnlyDeriv ()
                {
                        return this;
@@ -632,6 +637,11 @@ namespace Commons.Xml.Relaxng.Derivative
                        return this;
                }
 
+               internal override RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return this;
+               }
+
                internal override RdpPattern MixedTextDeriv ()
                {
                        return this;
@@ -853,6 +863,12 @@ namespace Commons.Xml.Relaxng.Derivative
                        return LValue.TextDeriv (s, reader).Choice (RValue.TextDeriv (s, reader));
                }
 
+               internal override RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return memo.EmptyTextDeriv (LValue)
+                               .Choice (memo.EmptyTextDeriv (RValue));
+               }
+
                internal override RdpPattern TextOnlyDeriv ()
                {
                        return LValue.TextOnlyDeriv ().Choice (
@@ -1013,6 +1029,12 @@ namespace Commons.Xml.Relaxng.Derivative
                                .Choice (LValue.Interleave (RValue.TextDeriv (s, reader)));
                }
 
+               internal override RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return memo.EmptyTextDeriv (LValue).Interleave (RValue)
+                               .Choice (LValue.Interleave (memo.EmptyTextDeriv (RValue)));
+               }
+
                internal override RdpPattern TextOnlyDeriv ()
                {
                        return LValue.TextOnlyDeriv ().Interleave (
@@ -1166,6 +1188,13 @@ namespace Commons.Xml.Relaxng.Derivative
                                p.Choice (RValue.TextDeriv (s, reader)) : p;
                }
 
+               internal override RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       RdpPattern p = memo.EmptyTextDeriv (LValue).Group (RValue);
+                       return LValue.Nullable ?
+                               p.Choice (memo.EmptyTextDeriv (RValue)) : p;
+               }
+
                internal override RdpPattern TextOnlyDeriv ()
                {
                        return LValue.TextOnlyDeriv ().Group (
@@ -1369,6 +1398,11 @@ namespace Commons.Xml.Relaxng.Derivative
                        return Child.TextDeriv (s, reader).Group (this.Choice (RdpEmpty.Instance));
                }
 
+               internal virtual RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return memo.EmptyTextDeriv (Child).Group (this.Choice (RdpEmpty.Instance));
+               }
+
                internal override RdpPattern TextOnlyDeriv ()
                {
                        return Child.TextOnlyDeriv ().OneOrMore ();
@@ -1519,6 +1553,11 @@ namespace Commons.Xml.Relaxng.Derivative
                                return RdpNotAllowed.Instance;
                }
 
+               internal virtual RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return RdpEmpty.Instance;
+               }
+
                internal override void CheckConstraints (bool attribute, bool oneOrMore, bool oneOrMoreGroup, bool oneOrMoreInterleave, bool list, bool dataExcept)
                {
                        if (list)
@@ -2009,6 +2048,11 @@ namespace Commons.Xml.Relaxng.Derivative
                        return LValue.TextDeriv (s, reader).After (RValue);
                }
 
+               internal override RdpPattern EmptyTextDeriv (MemoizationStore memo)
+               {
+                       return memo.EmptyTextDeriv (LValue).After (RValue);
+               }
+
                internal override RdpPattern TextOnlyDeriv ()
                {
                        return LValue.TextOnlyDeriv ().After (RValue);
index bb1615fcbcbc61c993c4c8249b0299fb831cd804..13a492777e4d4bb226d5658153ec075def8d0f50 100644 (file)
@@ -1,3 +1,8 @@
+2006-01-12  Atsushi Enomoto <atsushi@ximian.com>
+
+       * RelaxngValidatingReader.cs : Use RdpPattern.EmptyTextDeriv(). It
+         significantly improves performance wrt empty text nodes.
+
 2006-01-10  Atsushi Enomoto <atsushi@ximian.com>
 
        * RelaxngValidatingReader.cs :
index 78d9037c9178ea80d4ab15f8cbe09c704c463ec3..defbf501822a9db47d4e3513a624e9d2479f0924 100644 (file)
@@ -680,7 +680,7 @@ int nStartAttDeriv = 0;
                        if (m != null)
                                return m;
 
-                       m = p.TextDeriv (String.Empty, null);
+                       m = p.EmptyTextDeriv (this);
                        emptyText [p] = m;
                        return m;
                }