72496Re: Why C? If so how is the best way to have simple lists ?
- Jul 28, 2013
> But it does not get the task done I talked about: type safe containerI think it would be hard to create a generic type-safe container library in C. I only see two options: rewrite container manipulation code for every type of object (as is done in Vim) or define the container code as a set of preprocessor macros. In both cases a lot of code is duplicated either by the programmer or by the compiler. Also a lot of code in Vim relies on linked lists so it would be a huge and error-prone task to change all that.
> like stuff.
A solution compatible with the current state of Vim would be to use helpers for various containers. A helper for the linked list would look like:
void *pit = *self->list_head_ptr;
*self->list_head_ptr = item;
*(void**)((char*)item + self->offset_of_next) = pit; /* item->next = pit */
if (self->list_tail_ptr && ! *self->list_tail_ptr)
*self->list_tail_ptr = pit;
A list of Node structures along with it's helper would be initialized as:
my_node_list.list_head_ptr = &my_nodes;
my_node_list.list_tail_ptr = NULL; // we only use the forward pointer
my_node_list.offset_of_next = offsetof(Node, next);
my_node_list.offset_of_prev = -1; // reverse pointer doesn't exist
Node* pnode = createNode();
You can still traverse the list in a type-safe way through my_nodes. The manipulation of the list through the list helper is type unsafe.
If you feel it is absolutely necessary, a kind of run-time type safety could be achieved by adding a typeid member to the beginning of every structure that would be used in a container. The typeid for a structure would be set in a 'constructor' like createNode(). The same typeid would also be set in the helper during initialization. The helper methods would compare the value from the element to the value of the container.
A more complex implementation of the ListHelper is in the file puls_st.c starting around line 108. It's not exactly C (without some preprocessing) but it will give you an idea.
A use example is in puls_st.c around line 2466 (_txmfac_init).
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
For more options, visit https://groups.google.com/groups/opt_out.
- << Previous post in topic Next post in topic >>