public bool TryRelease(int target) { if (this.rangeList.Count == 0) { this.rangeList.AddFirst(new IDIssuance.Range(target, target)); return(true); } for (LinkedListNode <IDIssuance.Range> linkedListNode = this.rangeList.First; linkedListNode != null; linkedListNode = linkedListNode.Next) { if (linkedListNode.Value.min - 1 > target) { IDIssuance.Range value = new IDIssuance.Range(target, target); this.rangeList.AddBefore(linkedListNode, value); return(true); } if (linkedListNode.Value.min - 1 == target) { linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min - 1, linkedListNode.Value.max); return(true); } if (linkedListNode.Value.min <= target && linkedListNode.Value.max >= target) { return(false); } if (linkedListNode.Value.max + 1 == target) { linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min, linkedListNode.Value.max + 1); return(true); } } return(false); }
public bool TryReserveNextOf(int target, out int reserved) { reserved = target; for (LinkedListNode <IDIssuance.Range> linkedListNode = this.rangeList.First; linkedListNode != null; linkedListNode = linkedListNode.Next) { if (linkedListNode.Value.min > target) { reserved = linkedListNode.Value.min; linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min + 1, linkedListNode.Value.max); this.checkNode(linkedListNode); return(true); } if (linkedListNode.Value.min == target) { linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min + 1, linkedListNode.Value.max); this.checkNode(linkedListNode); return(true); } if (linkedListNode.Value.min < target && linkedListNode.Value.max > target) { IDIssuance.Range value = new IDIssuance.Range(target + 1, linkedListNode.Value.max); linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min, target - 1); this.rangeList.AddAfter(linkedListNode, value); return(true); } if (linkedListNode.Value.max == target) { linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min, linkedListNode.Value.max - 1); this.checkNode(linkedListNode); return(true); } } reserved = 0; return(false); }
public bool TryReserve(int target) { LinkedListNode <IDIssuance.Range> linkedListNode = this.rangeList.First; while (linkedListNode != null && linkedListNode.Value.min <= target) { if (linkedListNode.Value.min == target) { linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min + 1, linkedListNode.Value.max); this.checkNode(linkedListNode); return(true); } if (linkedListNode.Value.min < target && linkedListNode.Value.max > target) { IDIssuance.Range value = new IDIssuance.Range(target + 1, linkedListNode.Value.max); linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min, target - 1); this.rangeList.AddAfter(linkedListNode, value); return(true); } if (linkedListNode.Value.max == target) { linkedListNode.Value = new IDIssuance.Range(linkedListNode.Value.min, linkedListNode.Value.max - 1); this.checkNode(linkedListNode); return(true); } linkedListNode = linkedListNode.Next; } return(false); }