public long ReserveNew() { this.VerifyIdentifiersLeft(); IdentifierManager.Segment segment = this.segments[0]; long start = segment.start; ++segment.start; if (segment.start > segment.end) { this.segments.RemoveAt(0); } return(start); }
public long Reserve(long id) { if (id < this.lowerbound || id > this.upperbound) { throw new ArgumentException("Value for parameter 'id' was out of bounds"); } this.VerifyIdentifiersLeft(); if (id == this.upperbound) { int index = this.segments.Count - 1; IdentifierManager.Segment segment = this.segments[index]; if (segment.end != this.upperbound) { return(this.ReserveNew()); } segment.end = this.upperbound - 1L; if (segment.start > segment.end) { this.segments.RemoveAt(index); } return(id); } if (id == this.lowerbound) { IdentifierManager.Segment segment = this.segments[0]; if (segment.start != this.lowerbound) { return(this.ReserveNew()); } segment.start = this.lowerbound + 1L; if (segment.end < segment.start) { this.segments.RemoveAt(0); } return(id); } for (int index = 0; index < this.segments.Count; ++index) { IdentifierManager.Segment segment = this.segments[index]; if (segment.end >= id) { if (segment.start <= id) { if (segment.start == id) { segment.start = id + 1L; if (segment.end < segment.start) { this.segments.Remove(segment); } return(id); } if (segment.end == id) { segment.end = id - 1L; if (segment.start > segment.end) { this.segments.Remove(segment); } return(id); } this.segments.Add(new IdentifierManager.Segment(id + 1L, segment.end)); segment.end = id - 1L; return(id); } break; } } return(this.ReserveNew()); }
public bool Release(long id) { if (id < this.lowerbound || id > this.upperbound) { throw new ArgumentException("Value for parameter 'id' was out of bounds"); } if (id == this.upperbound) { IdentifierManager.Segment segment = this.segments[this.segments.Count - 1]; if (segment.end == this.upperbound - 1L) { segment.end = this.upperbound; return(true); } if (segment.end == this.upperbound) { return(false); } this.segments.Add(new IdentifierManager.Segment(this.upperbound, this.upperbound)); return(true); } if (id == this.lowerbound) { IdentifierManager.Segment segment = this.segments[0]; if (segment.start == this.lowerbound + 1L) { segment.start = this.lowerbound; return(true); } if (segment.start == this.lowerbound) { return(false); } this.segments.Insert(0, new IdentifierManager.Segment(this.lowerbound, this.lowerbound)); return(true); } long num1 = id + 1L; long num2 = id - 1L; for (int index = 0; index < this.segments.Count; ++index) { IdentifierManager.Segment segment1 = this.segments[0]; if (segment1.end >= num2) { if (segment1.start > num1) { this.segments.Insert(index, new IdentifierManager.Segment(id, id)); return(true); } if (segment1.start == num1) { segment1.start = id; return(true); } if (segment1.end == num2) { segment1.end = id; if (index + 1 < this.segments.Count) { IdentifierManager.Segment segment2 = this.segments[index + 1]; if (segment2.start == segment1.end + 1L) { segment1.end = segment2.end; this.segments.Remove(segment2); } } return(true); } break; } } return(false); }