code: func (c *PrefixCondition) Evaluate(path *Path, _ *PolicyOptions) bool {
  	var key string
  	var masklen uint8
  	keyf := func(ip net.IP, ones int) string {
  		var buffer bytes.Buffer
  		for i := 0; i < len(ip) && i < ones; i++ {
  			buffer.WriteString(fmt.Sprintf("%08b", ip[i]))
  		}
  		return buffer.String()[:ones]
  	}
  	family := path.GetRouteFamily()
  	switch family {
  	case bgp.RF_IPv4_UC:
  		masklen = path.GetNlri().(*bgp.IPAddrPrefix).Length
  		key = keyf(path.GetNlri().(*bgp.IPAddrPrefix).Prefix, int(masklen))
  	case bgp.RF_IPv6_UC:
  		masklen = path.GetNlri().(*bgp.IPv6AddrPrefix).Length
  		key = keyf(path.GetNlri().(*bgp.IPv6AddrPrefix).Prefix, int(masklen))
  	default:
  		return false
  	}
  	if family != c.set.family {
  		return false
  	}
  
  	result := false
  	_, ps, ok := c.set.tree.LongestPrefix(key)
  	if ok {
  		for _, p := range ps.([]*Prefix) {
  			if p.MasklengthRangeMin <= masklen && masklen <= p.MasklengthRangeMax {
  				result = true
  				break
  			}
  		}
  	}
  
  	if c.option == MATCH_OPTION_INVERT {
  		result = !result
  	}
  
  	return result
  }
docs: // compare prefixes in this condition and nlri of path and
  // subsequent comparison is skipped if that matches the conditions.
  // If PrefixList's length is zero, return true.