func (c *KeyCursor) ReadFloatBlock(buf *[]FloatValue) ([]FloatValue, error) {
LOOP:
	if len(c.current) == 0 {
		return nil, nil
	}
	first := c.current[0]
	*buf = (*buf)[:0]
	values, err := first.r.ReadFloatBlockAt(&first.entry, buf)
	if err != nil {
		return nil, err
	}
	if c.col != nil {
		c.col.GetCounter(floatBlocksDecodedCounter).Add(1)
		c.col.GetCounter(floatBlocksSizeCounter).Add(int64(first.entry.Size))
	}
	values = FloatValues(values).Exclude(first.readMin, first.readMax)
	tombstones := first.r.TombstoneRange(c.key)
	values = c.filterFloatValues(tombstones, values)
	if len(values) == 0 && len(c.current) > 0 {
		c.current = c.current[1:]
		goto LOOP
	}
	if len(c.current) == 1 {
		if len(values) > 0 {
			first.markRead(values[0].UnixNano(), values[len(values)-1].UnixNano())
		}
		return values, nil
	}
	minT, maxT := first.readMin, first.readMax
	if len(values) > 0 {
		minT, maxT = values[0].UnixNano(), values[len(values)-1].UnixNano()
	}
	if c.ascending {
		for i := 1; i < len(c.current); i++ {
			cur := c.current[i]
			if cur.entry.MinTime < minT && !cur.read() {
				minT = cur.entry.MinTime
			}
		}
		for i := 1; i < len(c.current); i++ {
			cur := c.current[i]
			if cur.entry.OverlapsTimeRange(minT, maxT) && !cur.read() {
				if cur.entry.MaxTime > maxT {
					maxT = cur.entry.MaxTime
				}
				values = FloatValues(values).Include(minT, maxT)
				break
			}
		}
		for i := 1; i < len(c.current); i++ {
			cur := c.current[i]
			if !cur.entry.OverlapsTimeRange(minT, maxT) || cur.read() {
				cur.markRead(minT, maxT)
				continue
			}
			tombstones := cur.r.TombstoneRange(c.key)
			var a []FloatValue
			v, err := cur.r.ReadFloatBlockAt(&cur.entry, &a)
			if err != nil {
				return nil, err
			}
			if c.col != nil {
				c.col.GetCounter(floatBlocksDecodedCounter).Add(1)
				c.col.GetCounter(floatBlocksSizeCounter).Add(int64(cur.entry.Size))
			}
			v = c.filterFloatValues(tombstones, v)
			v = FloatValues(v).Exclude(cur.readMin, cur.readMax)
			if len(v) > 0 {
				v = FloatValues(v).Include(minT, maxT)
				values = FloatValues(values).Merge(v)
			}
			cur.markRead(minT, maxT)
		}
	} else {
		for i := 1; i < len(c.current); i++ {
			cur := c.current[i]
			if cur.entry.MaxTime > maxT && !cur.read() {
				maxT = cur.entry.MaxTime
			}
		}
		for i := 1; i < len(c.current); i++ {
			cur := c.current[i]
			if cur.entry.OverlapsTimeRange(minT, maxT) && !cur.read() {
				if cur.entry.MinTime < minT {
					minT = cur.entry.MinTime
				}
				values = FloatValues(values).Include(minT, maxT)
				break
			}
		}
		for i := 1; i < len(c.current); i++ {
			cur := c.current[i]
			if !cur.entry.OverlapsTimeRange(minT, maxT) || cur.read() {
				cur.markRead(minT, maxT)
				continue
			}
			tombstones := cur.r.TombstoneRange(c.key)
			var a []FloatValue
			v, err := cur.r.ReadFloatBlockAt(&cur.entry, &a)
			if err != nil {
				return nil, err
			}
			if c.col != nil {
				c.col.GetCounter(floatBlocksDecodedCounter).Add(1)
				c.col.GetCounter(floatBlocksSizeCounter).Add(int64(cur.entry.Size))
			}
			v = c.filterFloatValues(tombstones, v)
			v = FloatValues(v).Exclude(cur.readMin, cur.readMax)
			if len(v) > 0 {
				v = FloatValues(v).Include(minT, maxT)
				values = FloatValues(v).Merge(values)
			}
			cur.markRead(minT, maxT)
		}
	}
	first.markRead(minT, maxT)
	return values, err
}
ReadFloatBlock reads the next block as a set of float values.
package tsm1