69 E Stack<E, F>::pop()
70 {
71 assert(!is_empty(), "popping from an empty stack");
72 if (this->_cur_seg_size == 1) {
73 E tmp = _cur_seg[--this->_cur_seg_size];
74 pop_segment();
75 return tmp;
76 }
77 return this->_cur_seg[--this->_cur_seg_size];
78 }
79
80 template <class E, MEMFLAGS F>
81 void Stack<E, F>::clear(bool clear_cache)
82 {
83 free_segments(_cur_seg);
84 if (clear_cache) free_segments(_cache);
85 reset(clear_cache);
86 }
87
88 template <class E, MEMFLAGS F>
89 size_t Stack<E, F>::default_segment_size()
90 {
91 // Number of elements that fit in 4K bytes minus the size of two pointers
92 // (link field and malloc header).
93 return (4096 - 2 * sizeof(E*)) / sizeof(E);
94 }
95
96 template <class E, MEMFLAGS F>
97 size_t Stack<E, F>::adjust_segment_size(size_t seg_size)
98 {
99 const size_t elem_sz = sizeof(E);
100 const size_t ptr_sz = sizeof(E*);
101 assert(elem_sz % ptr_sz == 0 || ptr_sz % elem_sz == 0, "bad element size");
102 if (elem_sz < ptr_sz) {
103 return align_size_up(seg_size * elem_sz, ptr_sz) / elem_sz;
104 }
105 return seg_size;
106 }
107
108 template <class E, MEMFLAGS F>
109 size_t Stack<E, F>::link_offset() const
110 {
111 return align_size_up(this->_seg_size * sizeof(E), sizeof(E*));
112 }
113
114 template <class E, MEMFLAGS F>
115 size_t Stack<E, F>::segment_bytes() const
116 {
|
69 E Stack<E, F>::pop()
70 {
71 assert(!is_empty(), "popping from an empty stack");
72 if (this->_cur_seg_size == 1) {
73 E tmp = _cur_seg[--this->_cur_seg_size];
74 pop_segment();
75 return tmp;
76 }
77 return this->_cur_seg[--this->_cur_seg_size];
78 }
79
80 template <class E, MEMFLAGS F>
81 void Stack<E, F>::clear(bool clear_cache)
82 {
83 free_segments(_cur_seg);
84 if (clear_cache) free_segments(_cache);
85 reset(clear_cache);
86 }
87
88 template <class E, MEMFLAGS F>
89 size_t Stack<E, F>::adjust_segment_size(size_t seg_size)
90 {
91 const size_t elem_sz = sizeof(E);
92 const size_t ptr_sz = sizeof(E*);
93 assert(elem_sz % ptr_sz == 0 || ptr_sz % elem_sz == 0, "bad element size");
94 if (elem_sz < ptr_sz) {
95 return align_size_up(seg_size * elem_sz, ptr_sz) / elem_sz;
96 }
97 return seg_size;
98 }
99
100 template <class E, MEMFLAGS F>
101 size_t Stack<E, F>::link_offset() const
102 {
103 return align_size_up(this->_seg_size * sizeof(E), sizeof(E*));
104 }
105
106 template <class E, MEMFLAGS F>
107 size_t Stack<E, F>::segment_bytes() const
108 {
|