예제 #1
0
파일: sh_utils.c 프로젝트: vilsbole/42sh
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;
	}
}
예제 #2
0
파일: f8types.hpp 프로젝트: Lezval/fix8
	/*! 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);
	}
예제 #3
0
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();
		}
	}
}