bool range_equals(struct range range, struct range other) { assert(range.begin <= range.end); assert(other.begin <= other.end); if (range_is_empty(range)) { return range_is_empty(other); } else { return range.begin == other.begin && range.end == other.end; } }
static void q35_host_get_pci_hole64_end(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { PCIHostState *h = PCI_HOST_BRIDGE(obj); Range w64; uint64_t value; pci_bus_get_w64_range(h->bus, &w64); value = range_is_empty(&w64) ? 0 : range_upb(&w64) + 1; visit_type_uint64(v, name, &value, errp); }
static void q35_host_get_pci_hole_end(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { Q35PCIHost *s = Q35_HOST_DEVICE(obj); uint64_t val64; uint32_t value; val64 = range_is_empty(&s->mch.pci_hole) ? 0 : range_upb(&s->mch.pci_hole) + 1; value = val64; assert(value == val64); visit_type_uint32(v, name, &value, errp); }
struct range range_extend_to_include_value(struct range range, int value) { assert(range.begin <= range.end); assert(value < INT_MAX); if (range_is_empty(range)) { return range_make(value, value + 1); } else { struct range extended_range = range; if (value < range.begin) extended_range.begin = value; if (value >= range.end) extended_range.end = value + 1; return extended_range; } }
void test_empty_range_does_not_contain_anything(void) { struct live_range range = { .start = 0, .end = 0 }; assert_false(in_range(&range, 0)); assert_false(in_range(&range, 1)); } void test_empy_range_is_empty(void) { struct live_range range = { .start = 0, .end = 0 }; assert_true(range_is_empty(&range)); } void test_range_length_treats_end_as_exclusive(void) { struct live_range range = { .start = 0, .end = 2 }; assert_int_equals(2, range_len(&range)); } void test_in_range_treats_end_as_exclusive(void) { struct live_range range = { .start = 0, .end = 2 }; assert_true(in_range(&range, 0)); assert_true(in_range(&range, 1)); assert_false(in_range(&range, 2)); } void test_range_that_is_within_another_range_intersects(void) { struct live_range range1 = { .start = 0, .end = 3 }; struct live_range range2 = { .start = 1, .end = 2 }; assert_true(ranges_intersect(&range1, &range2)); assert_true(ranges_intersect(&range2, &range1)); } void test_ranges_that_intersect(void) { struct live_range range1 = { .start = 0, .end = 2 }; struct live_range range2 = { .start = 1, .end = 3 }; assert_true(ranges_intersect(&range1, &range2)); assert_true(ranges_intersect(&range2, &range1)); } void test_ranges_that_do_not_intersect(void) { struct live_range range1 = { .start = 0, .end = 2 }; struct live_range range2 = { .start = 2, .end = 4 }; assert_false(ranges_intersect(&range1, &range2)); assert_false(ranges_intersect(&range2, &range1)); } void test_interval_add_range(void) { #if 0 struct live_interval it; struct live_range *r; INIT_LIST_HEAD(&it.range_list); interval_add_range(&it, 1, 3); r = interval_first_range(&it); assert_int_equals(1, r->start); assert_int_equals(3, r->end); assert_ptr_equals(NULL, next_range(&it.range_list, r)); interval_add_range(&it, 5, 7); r = interval_first_range(&it); assert_int_equals(1, r->start); assert_int_equals(3, r->end); r = next_range(&it.range_list, r); assert_int_equals(5, r->start); assert_int_equals(7, r->end); assert_ptr_equals(NULL, next_range(&it.range_list, r)); interval_add_range(&it, 3, 5); r = interval_first_range(&it); assert_int_equals(1, r->start); assert_int_equals(7, r->end); assert_ptr_equals(NULL, next_range(&it.range_list, r)); interval_add_range(&it, 7, 8); r = interval_first_range(&it); assert_int_equals(1, r->start); assert_int_equals(8, r->end); assert_ptr_equals(NULL, next_range(&it.range_list, r)); interval_add_range(&it, 10, 13); r = interval_first_range(&it); assert_int_equals(1, r->start); assert_int_equals(8, r->end); r = next_range(&it.range_list, r); assert_int_equals(10, r->start); assert_int_equals(13, r->end); assert_ptr_equals(NULL, next_range(&it.range_list, r)); interval_add_range(&it, 0, 14); r = interval_first_range(&it); assert_int_equals(0, r->start); assert_int_equals(14, r->end); assert_ptr_equals(NULL, next_range(&it.range_list, r)); #endif }