void parser_new_cmd(t_cmds **current_node, int *is_new_cmd, char **lex) { if (*is_new_cmd) { (*current_node)->cmd = new_arr(len_cmd(lex)); (*current_node)->rredir = new_arr((nb_item(lex, ">")) + 1); (*current_node)->lredir = new_arr((nb_item(lex, "<")) + 1); (*current_node)->drredir = new_arr((nb_item(lex, ">>")) + 1); *is_new_cmd = FALSE; } }
/*! Insert an element into the set \param what pointer to element to insert \return result with iterator to insert location and true or end() and false */ result insert(const_iterator what) { if (!_sz) { _arr = new T[_rsz]; memcpy(_arr, what, sizeof(T)); ++_sz; return result(_arr, true); } bool answer; iterator where(find(*what, answer)); if (answer) return result(end(), false); if (_sz < _rsz) { memmove(where + 1, where, (end() - where) * sizeof(T)); memcpy(where, what, sizeof(T)); } else { iterator new_arr(new T[_rsz = _sz + calc_reserve(_sz, _reserve)]); const size_t wptr(where - _arr); if (wptr > 0) memcpy(new_arr, _arr, sizeof(T) * wptr); memcpy(new_arr + wptr, what, sizeof(T)); memcpy(new_arr + wptr + 1, where, (end() - where) * sizeof(T)); delete[] _arr; _arr = new_arr; } ++_sz; return result(where, true); }
void resize_rearrange(array_nd<T, S>& a, const array<size_t, D>& new_sz, const array<size_t, L>& new_stride, bool pad = false, const T& padval = T()) { bool skip_flag = true; size_t dm = std::min(size_t(a.ndims()), size_t(new_sz.length())); array<index_array, tiny> id(a.ndims()); for(size_t i = dm; i < a.ndims(); i++) id[i] = idx(0); array<size_t, tiny> junc(dm); for(size_t i = 0; i < dm; i++) junc[i] = std::min(new_sz[i], a.size_nd(i)); for(size_t i = 0; i < dm; i++) { // should some dims be reverse and some not if(a.stride(i) >= new_stride[i]) id[i] = size_range(0, junc[i] - 1); else id[i] = size_range(junc[i] - 1, 0); if(a.stride(i) != new_stride[i] && !(new_sz[i] == 1) && !(a.size_nd(i) == 1)) skip_flag = false; } // if data is in the same position, it needs no repositioning. if(!skip_flag) { // shape of the old array, but with same number of dims as the new array array<size_t, tiny> new_szm(a.ndims(), 1); size_range new_szr(0, std::min(new_sz.length() - 1, a.ndims() - 1)); new_szm[new_szr] = new_sz[new_szr]; // performs shape manipulation on the array without resizing it: array_nd<T, data::ref_iterator<array_nd<T, S> > > new_arr(new_szm/* */, a); //new_arr.init(a); //TODO: ivl::serial(.) //and worry about dimension sorting force(new_arr(id)) = a(id); } if(pad) { id.resize(new_sz.length(), idx(0)); array_nd<T, data::ref_iterator<array_nd<T, S> > > new_arr(new_sz, a); // padding common dimensions for(size_t i = 0; i < dm; i++) { id[i] = size_range(junc[i], new_sz[i] - 1); new_arr(id) = padval; id[i] = index_all(); } // padding extra dimensions for(size_t i = dm; i < new_sz.length(); i++) { id[i] = size_range(1, new_sz[i] - 1); new_arr(id) = padval; id[i] = index_all(); } } }