/// <summary>Visit the different tokens of a packed tuple</summary>
        /// <param name="reader">Reader positionned at the start of a packed tuple</param>
        /// <param name="visitor">Lambda called for each segment of a tuple. Returns true to continue parsing, or false to stop</param>
        /// <returns>Number of tokens that have been visited until either <paramref name="visitor"/> returned false, or <paramref name="reader"/> reached the end.</returns>
        public static T VisitNext <T>(ref TupleReader reader, Func <Slice, TupleSegmentType, T> visitor)
        {
            if (!reader.Input.HasMore)
            {
                throw new InvalidOperationException("The reader has already reached the end");
            }
            var token = TupleParser.ParseNext(ref reader);

            return(visitor(token, TupleTypes.DecodeSegmentType(ref token)));
        }
 /// <summary>Skip a number of tokens</summary>
 /// <param name="reader">Cursor in the packed tuple to decode</param>
 /// <param name="count">Number of tokens to skip</param>
 /// <returns>True if there was <paramref name="count"/> tokens, false if the reader was too small.</returns>
 /// <remarks>Even if this method return true, you need to check that the reader has not reached the end before reading more token!</remarks>
 public static bool Skip(ref TupleReader reader, int count)
 {
     while (count-- > 0)
     {
         if (!reader.Input.HasMore)
         {
             return(false);
         }
         var token = TupleParser.ParseNext(ref reader);
         if (token.IsNull)
         {
             return(false);
         }
     }
     return(true);
 }