//============================================================ private static int SeekWithoutClamping(this StringView str, int start, SeekMode mode, Ward1D ward) { if (mode == SeekMode.MoveOneChar) { return(start + ward.GetOffset()); } else if (mode == SeekMode.UntilNewline) { if (ward == Ward1D.Backward) { return(str.FindLast('\n', start + 1)); } else if (ward == Ward1D.Forward) { return(str.FindFirst('\n', start)); } } else { Debug.Assert((mode & (SeekMode.LiterallySpaced | SeekMode.PassingQuotation | SeekMode.BracketBalanced)) != 0); if (ward == Ward1D.Backward) { return(str.SeekToSpaceBalanced(start, mode, -1, -1) - 1); } else if (ward == Ward1D.Forward) { return(str.SeekToSpaceBalanced(start + 1, mode, 1, 0)); } } throw new Exception(); }
//============================================================ public static int GetOffset(this Ward1D ward) { return(ward == Ward1D.Forward ? 1 : -1); }
//============================================================ //------------------------------------------------------------ //private static void TopDownTerms(AirTree<StringView>.Node node, StringView str) { // foreach ((BalancedTermType termType, StringView termStr) in str.EachTerm()) { // AirTree<StringView>.Node child = node.AddChild(termStr); // if (termType == BalancedTermType.Bracketed) { // TopDownTerms(child, termStr.GetSubView(+1, termStr.Length - 1)); // } // } //} //public static AirTree<StringView> TopDownTerms(this StringView str) { // var tree = new AirTree<StringView>(str); // TopDownTerms(tree.root, str); // return tree; //} //public static string TopDownTerms(this string str) { // return str.GetFullView().TopDownTerms().ToString(); //} //------------------------------------------------------------ //private static void HeadTail(AirTree<StringView>.Node node, StringView str) { // int count = 0; // foreach ((BalancedTermType termType, StringView termStr) in str.EachTerm()) { // if (count++ == 0) { // node.Value = termStr; // } else { // AirTree<StringView>.Node child = node.AddChild(termStr); // if (termType == BalancedTermType.Bracketed) { // HeadTail(child, termStr.GetSubView(+1, termStr.Length - 1)); // } // } // } //} //public static AirTree<StringView> HeadTail(this StringView str) { // var tree = new AirTree<StringView>(str); // HeadTail(tree.root, str); // return tree; //} //public static string HeadTail(this string str) { // return str.GetFullView().HeadTail().ToString(); //} //============================================================ public static int Seek(this StringView str, int start, SeekMode mode, Ward1D ward) { str.ValidateIndex(start); return(Mathf.Clamp(str.SeekWithoutClamping(start, mode, ward), 0, str.Length)); }