Changeset 32cab5b for doc/papers/general/evaluation/cpp-stack.hpp
- Timestamp:
- Apr 17, 2018, 12:01:09 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 3265399
- Parents:
- b2fe1c9 (diff), 81bb114 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/general/evaluation/cpp-stack.hpp
rb2fe1c9 r32cab5b 2 2 #include <utility> 3 3 4 template<typename T> classstack {4 template<typename T> struct stack { 5 5 struct node { 6 6 T value; 7 node* next; 7 node * next; 8 node( const T & v, node * n = nullptr ) : value( v ), next( n ) {} 9 }; 10 node * head; 8 11 9 node( const T& v, node* n = nullptr ) : value(v), next(n) {} 10 }; 11 node* head; 12 stack() : head( nullptr ) {} 13 stack( const stack<T> & o ) { copy( o ); } 12 14 13 void copy(const stack<T>& o) {14 node** crnt = &head;15 for ( node* next = o.head; next; next = next->next ) {16 *crnt = new node{ next->value }; /***/17 crnt = &(*crnt)->next;18 }19 *crnt = nullptr;20 }21 public:22 15 void clear() { 23 for ( node* next = head; next; ) {24 node * crnt = next;16 for ( node * next = head; next; ) { 17 node * crnt = next; 25 18 next = crnt->next; 26 19 delete crnt; … … 29 22 } 30 23 31 stack() : head(nullptr) {} 32 stack(const stack<T>& o) { copy(o); } 33 stack(stack<T>&& o) : head(o.head) { o.head = nullptr; } 24 void copy( const stack<T> & o ) { 25 node ** crnt = &head; 26 for ( node * next = o.head; next; next = next->next ) { 27 *crnt = new node{ next->value }; /***/ 28 crnt = &(*crnt)->next; 29 } 30 *crnt = nullptr; 31 } 32 34 33 ~stack() { clear(); } 35 34 36 stack & operator= (const stack<T>& o) {35 stack & operator= ( const stack<T> & o ) { 37 36 if ( this == &o ) return *this; 38 37 clear(); 39 copy(o); 40 return *this; 41 } 42 43 stack& operator= (stack<T>&& o) { 44 if ( this == &o ) return *this; 45 head = o.head; 46 o.head = nullptr; 38 copy( o ); 47 39 return *this; 48 40 } … … 50 42 bool empty() const { return head == nullptr; } 51 43 52 void push( const T& value) { head = new node{ value, head }; /***/ }44 void push( const T & value ) { head = new node{ value, head }; /***/ } 53 45 54 46 T pop() { 55 node * n = head;47 node * n = head; 56 48 head = n->next; 57 T x = std::move(n->value);49 T v = std::move( n->value ); 58 50 delete n; 59 return x;51 return v; 60 52 } 61 53 };
Note:
See TracChangeset
for help on using the changeset viewer.