

This example describes the usage of multiple inlists storing the same data. It means that some data may appear in more than one inlist at the same time. We will demonstrate this by creating an inlist with 100 numbers, and adding the odd numbers to the second inlist, then remove the numbers divisible by 3 from the second list.

To accomplish this, it is necessary to have two inlist pointers in the struct that is going to be stored. We are using the default inlist member \hyperlink{group__Eina__Inline__List__Group_gab30a76fcfa50307c797491705d60136a}{E\+I\+N\+A\+\_\+\+I\+N\+L\+I\+S\+T}, and adding another member {\ttfamily even} that is of type \hyperlink{group__Eina__Inline__List__Group_gad93973c87f867f249482e936797096ad}{Eina\+\_\+\+Inlist} too\+:


\begin{DoxyCodeInclude}
\textcolor{keyword}{struct }my\_struct \{
     \hyperlink{group__Eina__Inline__List__Group_gab30a76fcfa50307c797491705d60136a}{EINA\_INLIST};
     \hyperlink{struct__Eina__Inlist}{Eina\_Inlist} even;
     \textcolor{keywordtype}{int} a, b;
\};

\end{DoxyCodeInclude}


The representation for this struct is\+:

  
\begin{DoxyImageNoCaption}
  \mbox{\includegraphics{eina_inlist-node_eg3-my-struct}}
\end{DoxyImageNoCaption}


And we will define some convenience macros that are equivalent to \hyperlink{group__Eina__Inline__List__Group_ga5bc991428e75557c6195f6b9e38321fb}{E\+I\+N\+A\+\_\+\+I\+N\+L\+I\+S\+T\+\_\+\+G\+E\+T} and \hyperlink{group__Eina__Inline__List__Group_ga65080f9f858bdbeebc7ea46d17feb180}{E\+I\+N\+A\+\_\+\+I\+N\+L\+I\+S\+T\+\_\+\+C\+O\+N\+T\+A\+I\+N\+E\+R\+\_\+\+G\+E\+T} \+:


\begin{DoxyCodeInclude}
\textcolor{preprocessor}{#define EVEN\_INLIST\_GET(Inlist) (& ((Inlist)->even))}

\textcolor{preprocessor}{#define EVEN\_INLIST\_CONTAINER\_GET(ptr, type) \(\backslash\)}
\textcolor{preprocessor}{   ((type *)((char *)ptr - offsetof(type, even)))}

\end{DoxyCodeInclude}


We need two pointers, one for each list, and a pointer that will be used as an iterator\+:


\begin{DoxyCodeInclude}
   \hyperlink{struct__Eina__Inlist}{Eina\_Inlist} *list = NULL, *list\_even = NULL, *itr;

\end{DoxyCodeInclude}


Now we allocate and add to the first list every number from 0 to 99. These nodes data also have the \hyperlink{group__Eina__Inline__List__Group_gad93973c87f867f249482e936797096ad}{Eina\+\_\+\+Inlist} node info for the second list ({\ttfamily even}). We will use them to add just the even numbers to the second list, the {\ttfamily list\+\_\+even}. Also notice that we are using our macro {\ttfamily E\+V\+E\+N\+\_\+\+I\+N\+L\+I\+S\+T\+\_\+\+G\+E\+T} to get the pointer to the even list node info\+:


\begin{DoxyCodeInclude}
   \textcolor{keywordflow}{for} (i = 0; i < 100; i++)
     \{
        d = malloc(\textcolor{keyword}{sizeof}(*d));
        d->a = i;
        d->b = i * 10;
        list = \hyperlink{group__Eina__Inline__List__Group_ga095c6abf8b0122e30271ce98c26c0524}{eina\_inlist\_append}(list, \hyperlink{group__Eina__Inline__List__Group_ga5bc991428e75557c6195f6b9e38321fb}{EINA\_INLIST\_GET}(d));
        \textcolor{keywordflow}{if} ((i % 2) == 0)
          list\_even = \hyperlink{group__Eina__Inline__List__Group_ga9b05113628965ac5865c35c8ace6562d}{eina\_inlist\_prepend}(list\_even, EVEN\_INLIST\_GET(d));
     \}

\end{DoxyCodeInclude}


And the resulting lists will be as follow\+:

  
\begin{DoxyImageNoCaption}
  \mbox{\includegraphics[width=\textwidth]{eina_inlist-node_eg3-two-inlists}}
\end{DoxyImageNoCaption}


For the first list, we can use the macro \hyperlink{group__Eina__Inline__List__Group_ga65e496b9b16d527d23c1d735652b4e62}{E\+I\+N\+A\+\_\+\+I\+N\+L\+I\+S\+T\+\_\+\+F\+O\+R\+E\+A\+C\+H} to iterate over its elements\+:


\begin{DoxyCodeInclude}
   \hyperlink{group__Eina__Inline__List__Group_ga65e496b9b16d527d23c1d735652b4e62}{EINA\_INLIST\_FOREACH}(list, cur)
     printf("\(\backslash\)ta=%d, b=%d\(\backslash\)n", cur->a, cur->b);

\end{DoxyCodeInclude}


But for the second list, we have to do it manually. Of course we could create a similar macro to \hyperlink{group__Eina__Inline__List__Group_ga65e496b9b16d527d23c1d735652b4e62}{E\+I\+N\+A\+\_\+\+I\+N\+L\+I\+S\+T\+\_\+\+F\+O\+R\+E\+A\+C\+H}, but since this macro is more complex than the other two and we are using it only once, it's better to just do it manually\+:


\begin{DoxyCodeInclude}
   \textcolor{keywordflow}{for} (itr = list\_even; itr != NULL; itr = itr->next)
     \{
        cur = EVEN\_INLIST\_CONTAINER\_GET(itr, \textcolor{keyword}{struct} my\_struct);
        printf(\textcolor{stringliteral}{"\(\backslash\)ta=%d, b=%d\(\backslash\)n"}, cur->a, cur->b);
     \}

\end{DoxyCodeInclude}


Let's just check that the two lists have the expected number of elements\+:


\begin{DoxyCodeInclude}
   printf(\textcolor{stringliteral}{"list count=%d\(\backslash\)n"}, \hyperlink{group__Eina__Inline__List__Group_ga20d6e4482cda609591cb504c7f0463f5}{eina\_inlist\_count}(list));
   printf(\textcolor{stringliteral}{"list\_even count=%d\(\backslash\)n\(\backslash\)n"}, \hyperlink{group__Eina__Inline__List__Group_ga20d6e4482cda609591cb504c7f0463f5}{eina\_inlist\_count}(list\_even));

\end{DoxyCodeInclude}


And removing the numbers divisible by 3 only from the second list\+:


\begin{DoxyCodeInclude}
   itr = list\_even;
   \textcolor{keywordflow}{while} (itr)
     \{
        \hyperlink{struct__Eina__Inlist}{Eina\_Inlist} *next = itr->\hyperlink{struct__Eina__Inlist_ae95deba8e271f94f8ad8aecf7fdb5dde}{next};
        cur = EVEN\_INLIST\_CONTAINER\_GET(itr, \textcolor{keyword}{struct} my\_struct);
        \textcolor{keywordflow}{if} ((cur->a % 3) == 0)
          list\_even = \hyperlink{group__Eina__Inline__List__Group_gad84d4a8ad4c3392df4be8278ce10a274}{eina\_inlist\_remove}(list\_even, itr);
        itr = next;
     \}
   printf(\textcolor{stringliteral}{"list count=%d\(\backslash\)n"}, \hyperlink{group__Eina__Inline__List__Group_ga20d6e4482cda609591cb504c7f0463f5}{eina\_inlist\_count}(list));
   printf(\textcolor{stringliteral}{"list\_even count=%d\(\backslash\)n\(\backslash\)n"}, \hyperlink{group__Eina__Inline__List__Group_ga20d6e4482cda609591cb504c7f0463f5}{eina\_inlist\_count}(list\_even));

\end{DoxyCodeInclude}


Now that we don't need the two lists anymore, we can just free all the items. Since all of the allocated data was put into the first list, and both lists are made of pointers to inside the data structures, we can free only the first list (that contains all the elements) and the second list will be gone with it\+:


\begin{DoxyCodeInclude}
   \textcolor{keywordflow}{while} (list)
     \{
        \textcolor{keyword}{struct }my\_struct *aux = \hyperlink{group__Eina__Inline__List__Group_ga65080f9f858bdbeebc7ea46d17feb180}{EINA\_INLIST\_CONTAINER\_GET}(list,
                                                          \textcolor{keyword}{struct} my\_struct);
        list = \hyperlink{group__Eina__Inline__List__Group_gad84d4a8ad4c3392df4be8278ce10a274}{eina\_inlist\_remove}(list, list);
        free(aux);

\end{DoxyCodeInclude}


To see the full source code for this example, click here\+: \hyperlink{eina_inlist_03_c}{eina\+\_\+inlist\+\_\+03.\+c Eina\+\_\+\+Inlist advanced usage -\/ multi-\/inlists source} 