1 // Written in the D programming language.
2 
3 /**
4 This module defines generic containers.
5 
6 Construction:
7 
8 To implement the different containers both struct and class based
9 approaches have been used. $(REF make, std,_container,util) allows for
10 uniform construction with either approach.
11 
12 ---
13 import std.container;
14 // Construct a red-black tree and an array both containing the values 1, 2, 3.
15 // RedBlackTree should typically be allocated using `new`
16 RedBlackTree!int rbTree = new RedBlackTree!int(1, 2, 3);
17 // But `new` should not be used with Array
18 Array!int array = Array!int(1, 2, 3);
19 // `make` hides the differences
20 RedBlackTree!int rbTree2 = make!(RedBlackTree!int)(1, 2, 3);
21 Array!int array2 = make!(Array!int)(1, 2, 3);
22 ---
23 
24 Note that $(D make) can infer the element type from the given arguments.
25 
26 ---
27 import std.container;
28 auto rbTree = make!RedBlackTree(1, 2, 3); // RedBlackTree!int
29 auto array = make!Array("1", "2", "3"); // Array!string
30 ---
31 
32 Reference_semantics:
33 
34 All containers have reference semantics, which means that after
35 assignment both variables refer to the same underlying data.
36 
37 To make a copy of a _container, use the $(D c._dup) _container primitive.
38 ---
39 import std.container, std.range;
40 Array!int originalArray = make!(Array!int)(1, 2, 3);
41 Array!int secondArray = originalArray;
42 assert(equal(originalArray[], secondArray[]));
43 
44 // changing one instance changes the other one as well!
45 originalArray[0] = 12;
46 assert(secondArray[0] == 12);
47 
48 // secondArray now refers to an independent copy of originalArray
49 secondArray = originalArray.dup;
50 secondArray[0] = 1;
51 // assert that originalArray has not been affected
52 assert(originalArray[0] == 12);
53 ---
54 
55 $(B Attention:) If the _container is implemented as a class, using an
56 uninitialized instance can cause a null pointer dereference.
57 
58 ---
59 import std.container;
60 
61 RedBlackTree!int rbTree;
62 rbTree.insert(5); // null pointer dereference
63 ---
64 
65 Using an uninitialized struct-based _container will work, because the struct
66 intializes itself upon use; however, up to this point the _container will not
67 have an identity and assignment does not create two references to the same
68 data.
69 
70 ---
71 import std.container;
72 
73 // create an uninitialized array
74 Array!int array1;
75 // array2 does _not_ refer to array1
76 Array!int array2 = array1;
77 array2.insertBack(42);
78 // thus array1 will not be affected
79 assert(array1.empty);
80 
81 // after initialization reference semantics work as expected
82 array1 = array2;
83 // now affects array2 as well
84 array1.removeBack();
85 assert(array2.empty);
86 ---
87 It is therefore recommended to always construct containers using
88 $(REF make, std,_container,util).
89 
90 This is in fact necessary to put containers into another _container.
91 For example, to construct an $(D Array) of ten empty $(D Array)s, use
92 the following that calls $(D make) ten times.
93 
94 ---
95 import std.container, std.range;
96 
97 auto arrOfArrs = make!Array(generate!(() => make!(Array!int)).take(10));
98 ---
99 
100 Submodules:
101 
102 This module consists of the following submodules:
103 
104 $(UL
105     $(LI
106         The $(MREF std, _container, array) module provides
107         an array type with deterministic control of memory, not reliant on
108         the GC unlike built-in arrays.
109     )
110     $(LI
111         The $(MREF std, _container, binaryheap) module
112         provides a binary heap implementation that can be applied to any
113         user-provided random-access range.
114     )
115     $(LI
116         The $(MREF std, _container, dlist) module provides
117         a doubly-linked list implementation.
118     )
119     $(LI
120         The $(MREF std, _container, rbtree) module
121         implements red-black trees.
122     )
123     $(LI
124         The $(MREF std, _container, slist) module
125         implements singly-linked lists.
126     )
127     $(LI
128         The $(MREF std, _container, util) module contains
129         some generic tools commonly used by _container implementations.
130     )
131 )
132 
133 The_primary_range_of_a_container:
134 
135 While some _containers offer direct access to their elements e.g. via
136 $(D opIndex), $(D c.front) or $(D c.back), access
137 and modification of a _container's contents is generally done through
138 its primary $(MREF_ALTTEXT range, std, range) type,
139 which is aliased as $(D C.Range). For example, the primary range type of
140 $(D Array!int) is $(D Array!int.Range).
141 
142 If the documentation of a member function of a _container takes
143 a parameter of type $(D Range), then it refers to the primary range type of
144 this _container. Oftentimes $(D Take!Range) will be used, in which case
145 the range refers to a span of the elements in the _container. Arguments to
146 these parameters $(B must) be obtained from the same _container instance
147 as the one being worked with. It is important to note that many generic range
148 algorithms return the same range type as their input range.
149 
150 ---
151 import std.algorithm.comparison : equal;
152 import std.algorithm.iteration : find;
153 import std.container;
154 import std.range : take;
155 
156 auto array = make!Array(1, 2, 3);
157 
158 // `find` returns an Array!int.Range advanced to the element "2"
159 array.linearRemove(array[].find(2));
160 
161 assert(array[].equal([1]));
162 
163 array = make!Array(1, 2, 3);
164 
165 // the range given to `linearRemove` is a Take!(Array!int.Range)
166 // spanning just the element "2"
167 array.linearRemove(array[].find(2).take(1));
168 
169 assert(array[].equal([1, 3]));
170 ---
171 
172 When any $(MREF_ALTTEXT range, std, range) can be passed as an argument to
173 a member function, the documention usually refers to the parameter's templated
174 type as $(D Stuff).
175 
176 ---
177 import std.algorithm.comparison : equal;
178 import std.container;
179 import std.range : iota;
180 
181 auto array = make!Array(1, 2);
182 
183 // the range type returned by `iota` is completely unrelated to Array,
184 // which is fine for Array.insertBack:
185 array.insertBack(iota(3, 10));
186 
187 assert(array[].equal([1, 2, 3, 4, 5, 6, 7, 8, 9]));
188 ---
189 
190 Container_primitives:
191 
192 Containers do not form a class hierarchy, instead they implement a
193 common set of primitives (see table below). These primitives each guarantee
194 a specific worst case complexity and thus allow generic code to be written
195 independently of the _container implementation.
196 
197 For example the primitives $(D c.remove(r)) and $(D c.linearRemove(r)) both
198 remove the sequence of elements in range $(D r) from the _container $(D c).
199 The primitive $(D c.remove(r)) guarantees
200 $(BIGOH n$(SUBSCRIPT r) log n$(SUBSCRIPT c)) complexity in the worst case and
201 $(D c.linearRemove(r)) relaxes this guarantee to $(BIGOH n$(SUBSCRIPT c)).
202 
203 Since a sequence of elements can be removed from a $(MREF_ALTTEXT doubly linked list,std,_container,dlist)
204 in constant time, $(D DList) provides the primitive $(D c.remove(r))
205 as well as $(D c.linearRemove(r)). On the other hand
206 $(MREF_ALTTEXT Array, std,_container, array) only offers $(D c.linearRemove(r)).
207 
208 The following table describes the common set of primitives that containers
209 implement.  A _container need not implement all primitives, but if a
210 primitive is implemented, it must support the syntax described in the $(B
211 syntax) column with the semantics described in the $(B description) column, and
212 it must not have a worst-case complexity worse than denoted in big-O notation in
213 the $(BIGOH ·) column.  Below, $(D C) means a _container type, $(D c) is
214 a value of _container type, $(D n$(SUBSCRIPT x)) represents the effective length of
215 value $(D x), which could be a single element (in which case $(D n$(SUBSCRIPT x)) is
216 $(D 1)), a _container, or a range.
217 
218 $(BOOKTABLE Container primitives,
219 $(TR
220     $(TH Syntax)
221     $(TH $(BIGOH ·))
222     $(TH Description)
223 )
224 $(TR
225     $(TDNW $(D C(x)))
226     $(TDNW $(D n$(SUBSCRIPT x)))
227     $(TD Creates a _container of type $(D C) from either another _container or a range.
228     The created _container must not be a null reference even if x is empty.)
229 )
230 $(TR
231     $(TDNW $(D c.dup))
232     $(TDNW $(D n$(SUBSCRIPT c)))
233     $(TD Returns a duplicate of the _container.)
234 )
235 $(TR
236     $(TDNW $(D c ~ x))
237     $(TDNW $(D n$(SUBSCRIPT c) + n$(SUBSCRIPT x)))
238     $(TD Returns the concatenation of $(D c) and $(D r). $(D x) may be a single
239         element or an input range.)
240 )
241 $(TR
242     $(TDNW $(D x ~ c))
243     $(TDNW $(D n$(SUBSCRIPT c) + n$(SUBSCRIPT x)))
244     $(TD Returns the concatenation of $(D x) and $(D c).  $(D x) may be a
245         single element or an input range type.)
246 )
247 $(LEADINGROWN 3, Iteration
248 )
249 $(TR
250     $(TD $(D c.Range))
251     $(TD)
252     $(TD The primary range type associated with the _container.)
253 )
254 $(TR
255     $(TD $(D c[]))
256     $(TDNW $(D log n$(SUBSCRIPT c)))
257     $(TD Returns a range
258          iterating over the entire _container, in a _container-defined order.)
259 )
260 $(TR
261     $(TDNW $(D c[a .. b]))
262     $(TDNW $(D log n$(SUBSCRIPT c)))
263     $(TD Fetches a portion of the _container from key $(D a) to key $(D b).)
264 )
265 $(LEADINGROWN 3, Capacity
266 )
267 $(TR
268     $(TD $(D c.empty))
269     $(TD $(D 1))
270     $(TD Returns $(D true) if the _container has no elements, $(D false) otherwise.)
271 )
272 $(TR
273     $(TD $(D c.length))
274     $(TDNW $(D log n$(SUBSCRIPT c)))
275     $(TD Returns the number of elements in the _container.)
276 )
277 $(TR
278     $(TDNW $(D c.length = n))
279     $(TDNW $(D n$(SUBSCRIPT c) + n))
280     $(TD Forces the number of elements in the _container to $(D n).
281         If the _container ends up growing, the added elements are initialized
282         in a _container-dependent manner (usually with $(D T.init)).)
283 )
284 $(TR
285     $(TD $(D c.capacity))
286     $(TDNW $(D log n$(SUBSCRIPT c)))
287     $(TD Returns the maximum number of elements that can be stored in the
288     _container without triggering a reallocation.)
289 )
290 $(TR
291     $(TD $(D c.reserve(x)))
292     $(TD $(D n$(SUBSCRIPT c)))
293     $(TD Forces $(D capacity) to at least $(D x) without reducing it.)
294 )
295 $(LEADINGROWN 3, Access
296 )
297 $(TR
298     $(TDNW $(D c.front))
299     $(TDNW $(D log n$(SUBSCRIPT c)))
300     $(TD Returns the first element of the _container, in a _container-defined order.)
301 )
302 $(TR
303     $(TDNW $(D c.moveFront))
304     $(TDNW $(D log n$(SUBSCRIPT c)))
305     $(TD Destructively reads and returns the first element of the
306          _container. The slot is not removed from the _container; it is left
307          initialized with $(D T.init). This routine need not be defined if $(D
308          front) returns a $(D ref).)
309 )
310 $(TR
311     $(TDNW $(D c.front = v))
312     $(TDNW $(D log n$(SUBSCRIPT c)))
313     $(TD Assigns $(D v) to the first element of the _container.)
314 )
315 $(TR
316     $(TDNW $(D c.back))
317     $(TDNW $(D log n$(SUBSCRIPT c)))
318     $(TD Returns the last element of the _container, in a _container-defined order.)
319 )
320 $(TR
321     $(TDNW $(D c.moveBack))
322     $(TDNW $(D log n$(SUBSCRIPT c)))
323     $(TD Destructively reads and returns the last element of the
324          _container. The slot is not removed from the _container; it is left
325          initialized with $(D T.init). This routine need not be defined if $(D
326          front) returns a $(D ref).)
327 )
328 $(TR
329     $(TDNW $(D c.back = v))
330     $(TDNW $(D log n$(SUBSCRIPT c)))
331     $(TD Assigns $(D v) to the last element of the _container.)
332 )
333 $(TR
334     $(TDNW $(D c[x]))
335     $(TDNW $(D log n$(SUBSCRIPT c)))
336     $(TD Provides indexed access into the _container. The index type is
337          _container-defined. A _container may define several index types (and
338          consequently overloaded indexing).)
339 )
340 $(TR
341     $(TDNW $(D c.moveAt(x)))
342     $(TDNW $(D log n$(SUBSCRIPT c)))
343     $(TD Destructively reads and returns the value at position $(D x). The slot
344          is not removed from the _container; it is left initialized with $(D
345          T.init).)
346 )
347 $(TR
348     $(TDNW $(D c[x] = v))
349     $(TDNW $(D log n$(SUBSCRIPT c)))
350     $(TD Sets element at specified index into the _container.)
351 )
352 $(TR
353     $(TDNW $(D c[x] $(I op)= v))
354     $(TDNW $(D log n$(SUBSCRIPT c)))
355     $(TD Performs read-modify-write operation at specified index into the
356         _container.)
357 )
358 $(LEADINGROWN 3, Operations
359 )
360 $(TR
361     $(TDNW $(D e in c))
362     $(TDNW $(D log n$(SUBSCRIPT c)))
363     $(TD Returns nonzero if e is found in $(D c).)
364 )
365 $(TR
366     $(TDNW $(D c.lowerBound(v)))
367     $(TDNW $(D log n$(SUBSCRIPT c)))
368     $(TD Returns a range of all elements strictly less than $(D v).)
369 )
370 $(TR
371     $(TDNW $(D c.upperBound(v)))
372     $(TDNW $(D log n$(SUBSCRIPT c)))
373     $(TD Returns a range of all elements strictly greater than $(D v).)
374 )
375 $(TR
376     $(TDNW $(D c.equalRange(v)))
377     $(TDNW $(D log n$(SUBSCRIPT c)))
378     $(TD Returns a range of all elements in $(D c) that are equal to $(D v).)
379 )
380 $(LEADINGROWN 3, Modifiers
381 )
382 $(TR
383     $(TDNW $(D c ~= x))
384     $(TDNW $(D n$(SUBSCRIPT c) + n$(SUBSCRIPT x)))
385     $(TD Appends $(D x) to $(D c). $(D x) may be a single element or an input range type.)
386 )
387 $(TR
388     $(TDNW $(D c.clear()))
389     $(TDNW $(D n$(SUBSCRIPT c)))
390     $(TD Removes all elements in $(D c).)
391 )
392 $(TR
393     $(TDNW $(D c.insert(x)))
394     $(TDNW $(D n$(SUBSCRIPT x) * log n$(SUBSCRIPT c)))
395     $(TD Inserts $(D x) in $(D c) at a position (or positions) chosen by $(D c).)
396 )
397 $(TR
398     $(TDNW $(D c.stableInsert(x)))
399     $(TDNW $(D n$(SUBSCRIPT x) * log n$(SUBSCRIPT c)))
400     $(TD Same as $(D c.insert(x)), but is guaranteed to not invalidate any ranges.)
401 )
402 $(TR
403     $(TDNW $(D c.linearInsert(v)))
404     $(TDNW $(D n$(SUBSCRIPT c)))
405     $(TD Same as $(D c.insert(v)) but relaxes complexity to linear.)
406 )
407 $(TR
408     $(TDNW $(D c.stableLinearInsert(v)))
409     $(TDNW $(D n$(SUBSCRIPT c)))
410     $(TD Same as $(D c.stableInsert(v)) but relaxes complexity to linear.)
411 )
412 $(TR
413     $(TDNW $(D c.removeAny()))
414     $(TDNW $(D log n$(SUBSCRIPT c)))
415     $(TD Removes some element from $(D c) and returns it.)
416 )
417 $(TR
418     $(TDNW $(D c.stableRemoveAny()))
419     $(TDNW $(D log n$(SUBSCRIPT c)))
420     $(TD Same as $(D c.removeAny()), but is guaranteed to not invalidate any
421          iterators.)
422 )
423 $(TR
424     $(TDNW $(D c.insertFront(v)))
425     $(TDNW $(D log n$(SUBSCRIPT c)))
426     $(TD Inserts $(D v) at the front of $(D c).)
427 )
428 $(TR
429     $(TDNW $(D c.stableInsertFront(v)))
430     $(TDNW $(D log n$(SUBSCRIPT c)))
431     $(TD Same as $(D c.insertFront(v)), but guarantees no ranges will be
432          invalidated.)
433 )
434 $(TR
435     $(TDNW $(D c.insertBack(v)))
436     $(TDNW $(D log n$(SUBSCRIPT c)))
437     $(TD Inserts $(D v) at the back of $(D c).)
438 )
439 $(TR
440     $(TDNW $(D c.stableInsertBack(v)))
441     $(TDNW $(D log n$(SUBSCRIPT c)))
442     $(TD Same as $(D c.insertBack(v)), but guarantees no ranges will be
443          invalidated.)
444 )
445 $(TR
446     $(TDNW $(D c.removeFront()))
447     $(TDNW $(D log n$(SUBSCRIPT c)))
448     $(TD Removes the element at the front of $(D c).)
449 )
450 $(TR
451     $(TDNW $(D c.stableRemoveFront()))
452     $(TDNW $(D log n$(SUBSCRIPT c)))
453     $(TD Same as $(D c.removeFront()), but guarantees no ranges will be
454          invalidated.)
455 )
456 $(TR
457     $(TDNW $(D c.removeBack()))
458     $(TDNW $(D log n$(SUBSCRIPT c)))
459     $(TD Removes the value at the back of $(D c).)
460 )
461 $(TR
462     $(TDNW $(D c.stableRemoveBack()))
463     $(TDNW $(D log n$(SUBSCRIPT c)))
464     $(TD Same as $(D c.removeBack()), but guarantees no ranges will be
465          invalidated.)
466 )
467 $(TR
468     $(TDNW $(D c.remove(r)))
469     $(TDNW $(D n$(SUBSCRIPT r) * log n$(SUBSCRIPT c)))
470     $(TD Removes range $(D r) from $(D c).)
471 )
472 $(TR
473     $(TDNW $(D c.stableRemove(r)))
474     $(TDNW $(D n$(SUBSCRIPT r) * log n$(SUBSCRIPT c)))
475     $(TD Same as $(D c.remove(r)), but guarantees iterators are not
476          invalidated.)
477 )
478 $(TR
479     $(TDNW $(D c.linearRemove(r)))
480     $(TDNW $(D n$(SUBSCRIPT c)))
481     $(TD Removes range $(D r) from $(D c).)
482 )
483 $(TR
484     $(TDNW $(D c.stableLinearRemove(r)))
485     $(TDNW $(D n$(SUBSCRIPT c)))
486     $(TD Same as $(D c.linearRemove(r)), but guarantees iterators are not
487          invalidated.)
488 )
489 $(TR
490     $(TDNW $(D c.removeKey(k)))
491     $(TDNW $(D log n$(SUBSCRIPT c)))
492     $(TD Removes an element from $(D c) by using its key $(D k).
493          The key's type is defined by the _container.)
494 )
495 $(TR
496     $(TDNW $(D ))
497     $(TDNW $(D ))
498     $(TD )
499 )
500 )
501 
502 Source: $(PHOBOSSRC std/_container/package.d)
503 
504 Copyright: Red-black tree code copyright (C) 2008- by Steven Schveighoffer. Other code
505 copyright 2010- Andrei Alexandrescu. All rights reserved by the respective holders.
506 
507 License: Distributed under the Boost Software License, Version 1.0.
508 (See accompanying file LICENSE_1_0.txt or copy at $(HTTP
509 boost.org/LICENSE_1_0.txt)).
510 
511 Authors: Steven Schveighoffer, $(HTTP erdani.com, Andrei Alexandrescu)
512  */
513 
514 module std.container;
515 
516 public import std.container.array;
517 public import std.container.binaryheap;
518 public import std.container.dlist;
519 public import std.container.rbtree;
520 public import std.container.slist;
521 
522 import std.meta;
523 
524 
525 /* The following documentation and type $(D TotalContainer) are
526 intended for developers only.
527 
528 $(D TotalContainer) is an unimplemented container that illustrates a
529 host of primitives that a container may define. It is to some extent
530 the bottom of the conceptual container hierarchy. A given container
531 most often will choose to only implement a subset of these primitives,
532 and define its own additional ones. Adhering to the standard primitive
533 names below allows generic code to work independently of containers.
534 
535 Things to remember: any container must be a reference type, whether
536 implemented as a $(D class) or $(D struct). No primitive below
537 requires the container to escape addresses of elements, which means
538 that compliant containers can be defined to use reference counting or
539 other deterministic memory management techniques.
540 
541 A container may choose to define additional specific operations. The
542 only requirement is that those operations bear different names than
543 the ones below, lest user code gets confused.
544 
545 Complexity of operations should be interpreted as "at least as good
546 as". If an operation is required to have $(BIGOH n) complexity, it
547 could have anything lower than that, e.g. $(BIGOH log(n)). Unless
548 specified otherwise, $(D n) inside a $(BIGOH) expression stands for
549 the number of elements in the container.
550  */
TotalContainer(T)551 struct TotalContainer(T)
552 {
553 /**
554 If the container has a notion of key-value mapping, $(D KeyType)
555 defines the type of the key of the container.
556  */
557     alias KeyType = T;
558 
559 /**
560 If the container has a notion of multikey-value mapping, $(D
561 KeyTypes[k]), where $(D k) is a zero-based unsigned number, defines
562 the type of the $(D k)th key of the container.
563 
564 A container may define both $(D KeyType) and $(D KeyTypes), e.g. in
565 the case it has the notion of primary/preferred key.
566  */
567     alias KeyTypes = AliasSeq!T;
568 
569 /**
570 If the container has a notion of key-value mapping, $(D ValueType)
571 defines the type of the value of the container. Typically, a map-style
572 container mapping values of type $(D K) to values of type $(D V)
573 defines $(D KeyType) to be $(D K) and $(D ValueType) to be $(D V).
574  */
575     alias ValueType = T;
576 
577 /**
578 Defines the container's primary range, which embodies one of the
579 ranges defined in $(MREF std,range).
580 
581 Generally a container may define several types of ranges.
582  */
583     struct Range
584     {
585         /++
586         Range primitives.
587         +/
588         @property bool empty()
589         {
590             assert(0);
591         }
592         /// Ditto
593         @property ref T front() //ref return optional
594         {
595             assert(0);
596         }
597         /// Ditto
598         @property void front(T value) //Only when front does not return by ref
599         {
600             assert(0);
601         }
602         /// Ditto
603         T moveFront()
604         {
605             assert(0);
606         }
607         /// Ditto
608         void popFront()
609         {
610             assert(0);
611         }
612         /// Ditto
613         @property ref T back() //ref return optional
614         {
615             assert(0);
616         }
617         /// Ditto
618         @property void back(T value) //Only when front does not return by ref
619         {
620             assert(0);
621         }
622         /// Ditto
623         T moveBack()
624         {
625             assert(0);
626         }
627         /// Ditto
628         void popBack()
629         {
630             assert(0);
631         }
632         /// Ditto
633         T opIndex(size_t i) //ref return optional
634         {
635             assert(0);
636         }
637         /// Ditto
638         void opIndexAssign(size_t i, T value) //Only when front does not return by ref
639         {
640             assert(0);
641         }
642         /// Ditto
643         T opIndexUnary(string op)(size_t i) //Only when front does not return by ref
644         {
645             assert(0);
646         }
647         /// Ditto
648         void opIndexOpAssign(string op)(size_t i, T value) //Only when front does not return by ref
649         {
650             assert(0);
651         }
652         /// Ditto
653         T moveAt(size_t i)
654         {
655             assert(0);
656         }
657         /// Ditto
658         @property size_t length()
659         {
660             assert(0);
661         }
662     }
663 
664 /**
665 Property returning $(D true) if and only if the container has no
666 elements.
667 
668 Complexity: $(BIGOH 1)
669  */
670     @property bool empty()
671     {
672         assert(0);
673     }
674 
675 /**
676 Returns a duplicate of the container. The elements themselves are not
677 transitively duplicated.
678 
679 Complexity: $(BIGOH n).
680  */
681     @property TotalContainer dup()
682     {
683         assert(0);
684     }
685 
686 /**
687 Returns the number of elements in the container.
688 
689 Complexity: $(BIGOH log(n)).
690 */
691     @property size_t length()
692     {
693         assert(0);
694     }
695 
696 /**
697 Returns the maximum number of elements the container can store without
698 (a) allocating memory, (b) invalidating iterators upon insertion.
699 
700 Complexity: $(BIGOH log(n)).
701  */
702     @property size_t capacity()
703     {
704         assert(0);
705     }
706 
707 /**
708 Ensures sufficient capacity to accommodate $(D n) elements.
709 
710 Postcondition: $(D capacity >= n)
711 
712 Complexity: $(BIGOH log(e - capacity)) if $(D e > capacity), otherwise
713 $(BIGOH 1).
714  */
715     void reserve(size_t e)
716     {
717         assert(0);
718     }
719 
720 /**
721 Returns a range that iterates over all elements of the container, in a
722 container-defined order. The container should choose the most
723 convenient and fast method of iteration for $(D opSlice()).
724 
725 Complexity: $(BIGOH log(n))
726  */
727     Range opSlice()
728     {
729         assert(0);
730     }
731 
732     /**
733        Returns a range that iterates the container between two
734        specified positions.
735 
736        Complexity: $(BIGOH log(n))
737      */
738     Range opSlice(size_t a, size_t b)
739     {
740         assert(0);
741     }
742 
743 /**
744 Forward to $(D opSlice().front) and $(D opSlice().back), respectively.
745 
746 Complexity: $(BIGOH log(n))
747  */
748     @property ref T front() //ref return optional
749     {
750         assert(0);
751     }
752     /// Ditto
753     @property void front(T value) //Only when front does not return by ref
754     {
755         assert(0);
756     }
757     /// Ditto
758     T moveFront()
759     {
760         assert(0);
761     }
762     /// Ditto
763     @property ref T back() //ref return optional
764     {
765         assert(0);
766     }
767     /// Ditto
768     @property void back(T value) //Only when front does not return by ref
769     {
770         assert(0);
771     }
772     /// Ditto
773     T moveBack()
774     {
775         assert(0);
776     }
777 
778 /**
779 Indexing operators yield or modify the value at a specified index.
780  */
781     ref T opIndex(KeyType) //ref return optional
782     {
783         assert(0);
784     }
785     /// ditto
786     void opIndexAssign(KeyType i, T value) //Only when front does not return by ref
787     {
788         assert(0);
789     }
790     /// ditto
791     T opIndexUnary(string op)(KeyType i) //Only when front does not return by ref
792     {
793         assert(0);
794     }
795     /// ditto
796     void opIndexOpAssign(string op)(KeyType i, T value) //Only when front does not return by ref
797     {
798         assert(0);
799     }
800     /// ditto
801     T moveAt(KeyType i)
802     {
803         assert(0);
804     }
805 
806 /**
807 $(D k in container) returns true if the given key is in the container.
808  */
809     bool opBinaryRight(string op)(KeyType k) if (op == "in")
810     {
811         assert(0);
812     }
813 
814 /**
815 Returns a range of all elements containing $(D k) (could be empty or a
816 singleton range).
817  */
818     Range equalRange(KeyType k)
819     {
820         assert(0);
821     }
822 
823 /**
824 Returns a range of all elements with keys less than $(D k) (could be
825 empty or a singleton range). Only defined by containers that store
826 data sorted at all times.
827  */
828     Range lowerBound(KeyType k)
829     {
830         assert(0);
831     }
832 
833 /**
834 Returns a range of all elements with keys larger than $(D k) (could be
835 empty or a singleton range).  Only defined by containers that store
836 data sorted at all times.
837  */
838     Range upperBound(KeyType k)
839     {
840         assert(0);
841     }
842 
843 /**
844 Returns a new container that's the concatenation of $(D this) and its
845 argument. $(D opBinaryRight) is only defined if $(D Stuff) does not
846 define $(D opBinary).
847 
848 Complexity: $(BIGOH n + m), where m is the number of elements in $(D
849 stuff)
850  */
851     TotalContainer opBinary(string op)(Stuff rhs) if (op == "~")
852     {
853         assert(0);
854     }
855 
856     /// ditto
857     TotalContainer opBinaryRight(string op)(Stuff lhs) if (op == "~")
858     {
859         assert(0);
860     }
861 
862 /**
863 Forwards to $(D insertAfter(this[], stuff)).
864  */
865     void opOpAssign(string op)(Stuff stuff) if (op == "~")
866     {
867         assert(0);
868     }
869 
870 /**
871 Removes all contents from the container. The container decides how $(D
872 capacity) is affected.
873 
874 Postcondition: $(D empty)
875 
876 Complexity: $(BIGOH n)
877  */
878     void clear()
879     {
880         assert(0);
881     }
882 
883 /**
884 Sets the number of elements in the container to $(D newSize). If $(D
885 newSize) is greater than $(D length), the added elements are added to
886 unspecified positions in the container and initialized with $(D
887 .init).
888 
889 Complexity: $(BIGOH abs(n - newLength))
890 
891 Postcondition: $(D _length == newLength)
892  */
893     @property void length(size_t newLength)
894     {
895         assert(0);
896     }
897 
898 /**
899 Inserts $(D stuff) in an unspecified position in the
900 container. Implementations should choose whichever insertion means is
901 the most advantageous for the container, but document the exact
902 behavior. $(D stuff) can be a value convertible to the element type of
903 the container, or a range of values convertible to it.
904 
905 The $(D stable) version guarantees that ranges iterating over the
906 container are never invalidated. Client code that counts on
907 non-invalidating insertion should use $(D stableInsert). Such code would
908 not compile against containers that don't support it.
909 
910 Returns: The number of elements added.
911 
912 Complexity: $(BIGOH m * log(n)), where $(D m) is the number of
913 elements in $(D stuff)
914  */
915     size_t insert(Stuff)(Stuff stuff)
916     {
917         assert(0);
918     }
919     ///ditto
920     size_t stableInsert(Stuff)(Stuff stuff)
921     {
922         assert(0);
923     }
924 
925 /**
926 Same as $(D insert(stuff)) and $(D stableInsert(stuff)) respectively,
927 but relax the complexity constraint to linear.
928  */
929     size_t linearInsert(Stuff)(Stuff stuff)
930     {
931         assert(0);
932     }
933     ///ditto
934     size_t stableLinearInsert(Stuff)(Stuff stuff)
935     {
936         assert(0);
937     }
938 
939 /**
940 Picks one value in an unspecified position in the container, removes
941 it from the container, and returns it. Implementations should pick the
942 value that's the most advantageous for the container. The stable version
943 behaves the same, but guarantees that ranges iterating over the container
944 are never invalidated.
945 
946 Precondition: $(D !empty)
947 
948 Returns: The element removed.
949 
950 Complexity: $(BIGOH log(n)).
951  */
952     T removeAny()
953     {
954         assert(0);
955     }
956     /// ditto
957     T stableRemoveAny()
958     {
959         assert(0);
960     }
961 
962 /**
963 Inserts $(D value) to the front or back of the container. $(D stuff)
964 can be a value convertible to the container's element type or a range
965 of values convertible to it. The stable version behaves the same, but
966 guarantees that ranges iterating over the container are never
967 invalidated.
968 
969 Returns: The number of elements inserted
970 
971 Complexity: $(BIGOH log(n)).
972  */
973     size_t insertFront(Stuff)(Stuff stuff)
974     {
975         assert(0);
976     }
977     /// ditto
978     size_t stableInsertFront(Stuff)(Stuff stuff)
979     {
980         assert(0);
981     }
982     /// ditto
983     size_t insertBack(Stuff)(Stuff stuff)
984     {
985         assert(0);
986     }
987     /// ditto
988     size_t stableInsertBack(T value)
989     {
990         assert(0);
991     }
992 
993 /**
994 Removes the value at the front or back of the container. The stable
995 version behaves the same, but guarantees that ranges iterating over
996 the container are never invalidated. The optional parameter $(D
997 howMany) instructs removal of that many elements. If $(D howMany > n),
998 all elements are removed and no exception is thrown.
999 
1000 Precondition: $(D !empty)
1001 
1002 Complexity: $(BIGOH log(n)).
1003  */
1004     void removeFront()
1005     {
1006         assert(0);
1007     }
1008     /// ditto
1009     void stableRemoveFront()
1010     {
1011         assert(0);
1012     }
1013     /// ditto
1014     void removeBack()
1015     {
1016         assert(0);
1017     }
1018     /// ditto
1019     void stableRemoveBack()
1020     {
1021         assert(0);
1022     }
1023 
1024 /**
1025 Removes $(D howMany) values at the front or back of the
1026 container. Unlike the unparameterized versions above, these functions
1027 do not throw if they could not remove $(D howMany) elements. Instead,
1028 if $(D howMany > n), all elements are removed. The returned value is
1029 the effective number of elements removed. The stable version behaves
1030 the same, but guarantees that ranges iterating over the container are
1031 never invalidated.
1032 
1033 Returns: The number of elements removed
1034 
1035 Complexity: $(BIGOH howMany * log(n)).
1036  */
1037     size_t removeFront(size_t howMany)
1038     {
1039         assert(0);
1040     }
1041     /// ditto
1042     size_t stableRemoveFront(size_t howMany)
1043     {
1044         assert(0);
1045     }
1046     /// ditto
1047     size_t removeBack(size_t howMany)
1048     {
1049         assert(0);
1050     }
1051     /// ditto
1052     size_t stableRemoveBack(size_t howMany)
1053     {
1054         assert(0);
1055     }
1056 
1057 /**
1058 Removes all values corresponding to key $(D k).
1059 
1060 Complexity: $(BIGOH m * log(n)), where $(D m) is the number of
1061 elements with the same key.
1062 
1063 Returns: The number of elements removed.
1064  */
1065     size_t removeKey(KeyType k)
1066     {
1067         assert(0);
1068     }
1069 
1070 /**
1071 Inserts $(D stuff) before, after, or instead range $(D r), which must
1072 be a valid range previously extracted from this container. $(D stuff)
1073 can be a value convertible to the container's element type or a range
1074 of objects convertible to it. The stable version behaves the same, but
1075 guarantees that ranges iterating over the container are never
1076 invalidated.
1077 
1078 Returns: The number of values inserted.
1079 
1080 Complexity: $(BIGOH n + m), where $(D m) is the length of $(D stuff)
1081  */
1082     size_t insertBefore(Stuff)(Range r, Stuff stuff)
1083     {
1084         assert(0);
1085     }
1086     /// ditto
1087     size_t stableInsertBefore(Stuff)(Range r, Stuff stuff)
1088     {
1089         assert(0);
1090     }
1091     /// ditto
1092     size_t insertAfter(Stuff)(Range r, Stuff stuff)
1093     {
1094         assert(0);
1095     }
1096     /// ditto
1097     size_t stableInsertAfter(Stuff)(Range r, Stuff stuff)
1098     {
1099         assert(0);
1100     }
1101     /// ditto
1102     size_t replace(Stuff)(Range r, Stuff stuff)
1103     {
1104         assert(0);
1105     }
1106     /// ditto
1107     size_t stableReplace(Stuff)(Range r, Stuff stuff)
1108     {
1109         assert(0);
1110     }
1111 
1112 /**
1113 Removes all elements belonging to $(D r), which must be a range
1114 obtained originally from this container. The stable version behaves the
1115 same, but guarantees that ranges iterating over the container are
1116 never invalidated.
1117 
1118 Returns: A range spanning the remaining elements in the container that
1119 initially were right after $(D r).
1120 
1121 Complexity: $(BIGOH m * log(n)), where $(D m) is the number of
1122 elements in $(D r)
1123  */
1124     Range remove(Range r)
1125     {
1126         assert(0);
1127     }
1128     /// ditto
1129     Range stableRemove(Range r)
1130     {
1131         assert(0);
1132     }
1133 
1134 /**
1135 Same as $(D remove) above, but has complexity relaxed to linear.
1136 
1137 Returns: A range spanning the remaining elements in the container that
1138 initially were right after $(D r).
1139 
1140 Complexity: $(BIGOH n)
1141  */
1142     Range linearRemove(Range r)
1143     {
1144         assert(0);
1145     }
1146     /// ditto
1147     Range stableLinearRemove(Range r)
1148     {
1149         assert(0);
1150     }
1151 }
1152 
1153 @safe unittest
1154 {
1155     TotalContainer!int test;
1156 }
1157