private static void Add(UriTemplateTrieNode root, KeyValuePair <UriTemplate, object> kvp) { UriTemplateTrieNode node = root; UriTemplate key = kvp.Key; bool flag = ((key.segments.Count == 0) || key.HasWildcard) || key.segments[key.segments.Count - 1].EndsWithSlash; for (int i = 0; i < key.segments.Count; i++) { if (i >= key.firstOptionalSegment) { node.endOfPath.Items.Add(kvp); } UriTemplatePathSegment segment = key.segments[i]; if (!segment.EndsWithSlash) { switch (segment.Nature) { case UriTemplatePartType.Literal: node.AddFinalLiteralSegment(segment as UriTemplateLiteralPathSegment, kvp); break; case UriTemplatePartType.Compound: node.AddFinalCompoundSegment(segment as UriTemplateCompoundPathSegment, kvp); break; case UriTemplatePartType.Variable: node.finalVariableSegment.Items.Add(kvp); break; } } else { switch (segment.Nature) { case UriTemplatePartType.Literal: node = node.AddNextLiteralSegment(segment as UriTemplateLiteralPathSegment); break; case UriTemplatePartType.Compound: node = node.AddNextCompoundSegment(segment as UriTemplateCompoundPathSegment); break; case UriTemplatePartType.Variable: node = node.AddNextVariableSegment(); break; } } } if (flag) { if (key.HasWildcard) { node.star.Items.Add(kvp); } else { node.endOfPath.Items.Add(kvp); } } }
static void Add(UriTemplateTrieNode root, KeyValuePair <UriTemplate, object> kvp) { // Currently UTT doesn't support teplates with ignoreTrailingSlash == true; thus we // don't care about supporting it in the trie as well. UriTemplateTrieNode current = root; UriTemplate ut = kvp.Key; bool needProcessingOnFinalNode = ((ut.segments.Count == 0) || ut.HasWildcard || ut.segments[ut.segments.Count - 1].EndsWithSlash); for (int i = 0; i < ut.segments.Count; ++i) { if (i >= ut.firstOptionalSegment) { current.endOfPath.Items.Add(kvp); } UriTemplatePathSegment ps = ut.segments[i]; if (!ps.EndsWithSlash) { Fx.Assert(i == ut.segments.Count - 1, "only the last segment can !EndsWithSlash"); Fx.Assert(!ut.HasWildcard, "path star cannot have !EndsWithSlash"); switch (ps.Nature) { case UriTemplatePartType.Literal: current.AddFinalLiteralSegment(ps as UriTemplateLiteralPathSegment, kvp); break; case UriTemplatePartType.Compound: current.AddFinalCompoundSegment(ps as UriTemplateCompoundPathSegment, kvp); break; case UriTemplatePartType.Variable: current.finalVariableSegment.Items.Add(kvp); break; default: Fx.Assert("Invalid value as PathSegment.Nature"); break; } } else { Fx.Assert(ps.EndsWithSlash, "ps.EndsWithSlash"); switch (ps.Nature) { case UriTemplatePartType.Literal: current = current.AddNextLiteralSegment(ps as UriTemplateLiteralPathSegment); break; case UriTemplatePartType.Compound: current = current.AddNextCompoundSegment(ps as UriTemplateCompoundPathSegment); break; case UriTemplatePartType.Variable: current = current.AddNextVariableSegment(); break; default: Fx.Assert("Invalid value as PathSegment.Nature"); break; } } } if (needProcessingOnFinalNode) { // if the last segment ended in a slash, there is still more to do if (ut.HasWildcard) { // e.g. "path1/path2/*" current.star.Items.Add(kvp); } else { // e.g. "path1/path2/" current.endOfPath.Items.Add(kvp); } } }