Comments (6)
Yeah seems right... I will work on your solution tomorrow...
from collections-c.
Yeah, I will work on this soon...
from collections-c.
Hi @mame98 ,
Thats a good point. I think it's the best to implement a wrapper around the base linked list. This will help us keep the linked list clean with only the functions it's supposed to provide.
- Ankur
from collections-c.
This is not bad idea. The most convinient way to implement this would be to keep the callback pointers in the container structure and just call them from appropriate functions if they are set. Two extra pointers shouldn't make much of a difference unless you're using lots of small containers, where the container structures themselves use a significant portion memory.
So basically if you wanted to set a callback you would do something like this:
ArrayConf ac;
array_conf_init(&ac);
ac.on_add = my_add_callback;
ac.on_remove = my_remove_callback;
Array *array;
array_new_conf(&ac, &array); // make a new array with this configuration
This is pretty easy to implement. We just need to add some extra function pointers to container and conf structures and then make sure to call them from appropriate function if they are set.
enum cc_stat array_add(Array *a, void *e) {
....
if (a->on_add)
a->on_add() // call if set
}
... and so on
from collections-c.
Okay, I think the way @ankurdh suggested is a bit better, because as you said that if you do not want the callbacks you are wasting memory.
You would just need to have some small wrapper functions which call the list functions but also trigger the callbacks...
So I would create a small structure like:
typedef struct
{
List *list;
on_add;
on_delete;
and so on...
}WatchList;
Then you would just implement an (inline) function to get the List from this WatchList. Also if there would be a small function to convert a 'normal' list to a WatchList it would be pretty easy to use...
What do you think?
from collections-c.
I don't think that the solution @ankurdh proposed is practical. For one you wouldn't be able to use a List and WatchList interchangeably. Any peace of code that expects a List wouldn't be able to use the WatchList because its essentially a different container with a different API. Another thing is that the wrapper seems redundant because if the caller already knows that it's calling a function that will trigger a callback then you might as well just pass a regular List and a callback to that caller. The point is that this approach just needlessly complicates matters without much benefit.
This type of thing makes sense in languages that have some kind of inheritance where you can pass around a super type and where you can have modified behaviour in sub types, but trying to do this in C is really ugly.
from collections-c.
Related Issues (20)
- How about adding AVL or Red Black tree data structure? HOT 4
- (deque.c): inline function upper_pow_two only valid for 32 bit size_t HOT 3
- PQueue heap-overflow HOT 1
- deque_remove_at error
- cc_array_reverse() fails when element count is even HOT 1
- Implementation error in `cc_array_reverse` and `cc_deque_reverse`
- cmake configuration failed on latest MSYS2 HOT 1
- document is inaccurate about key_compare function
- Is "stdio.h" necessary? HOT 1
- The call to mem_alloc in cc_array_subarray() is unsafe
- How about adding Bloom Filter data structure? HOT 2
- cc_list.c (index > list1->size)maybe is wrong
- file: cc_list.c function:static INLINE void merge(……) HOT 1
- File: cc_list.c Function: cc_list_iter_add
- Feature Request: provide release versioning HOT 1
- RFC: Distro specific packages HOT 1
- What happened to macros such as: DEQUE_FOREACH? HOT 1
- when make occurs error HOT 1
- Segfault when calling tree_min or tree_max with a sentinel node
- Treetable: Segfault when calling get_successor_node on root if it is the greatest key HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from collections-c.