
\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{\textcolor{comment}{//Compile with:}}
\DoxyCodeLine{\textcolor{comment}{//gcc -\/g eina\_hash\_01.c -\/o eina\_hash\_01 `pkg-\/config -\/-\/cflags -\/-\/libs eina`}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#include <stdio.h>}}
\DoxyCodeLine{\textcolor{preprocessor}{\#include <string.h>}}
\DoxyCodeLine{\textcolor{preprocessor}{\#include <\mbox{\hyperlink{Eina_8h}{Eina.h}}>}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{/*}}
\DoxyCodeLine{\textcolor{comment}{ * Eina Hash -\/ phonebook}}
\DoxyCodeLine{\textcolor{comment}{ *}}
\DoxyCodeLine{\textcolor{comment}{ * This example demonstrate the use of Eina Hash by implementing a phonebook}}
\DoxyCodeLine{\textcolor{comment}{ * that stores its contact data into the hash.}}
\DoxyCodeLine{\textcolor{comment}{ *}}
\DoxyCodeLine{\textcolor{comment}{ * It indexes the phone numbers by Contact Full Name, so it's a hash with}}
\DoxyCodeLine{\textcolor{comment}{ * string keys.}}
\DoxyCodeLine{\textcolor{comment}{ */}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{struct }\_Phone\_Entry \{}
\DoxyCodeLine{     \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name; \textcolor{comment}{// Full name.}}
\DoxyCodeLine{     \textcolor{keyword}{const} \textcolor{keywordtype}{char} *number; \textcolor{comment}{// Phone number.}}
\DoxyCodeLine{\};}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{typedef} \textcolor{keyword}{struct }\_Phone\_Entry Phone\_Entry;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} Phone\_Entry \_start\_entries[] = \{}
\DoxyCodeLine{       \{ \textcolor{stringliteral}{"{}Wolfgang Amadeus Mozart"{}}, \textcolor{stringliteral}{"{}+01 23 456-\/78910"{}} \},}
\DoxyCodeLine{       \{ \textcolor{stringliteral}{"{}Ludwig van Beethoven"{}}, \textcolor{stringliteral}{"{}+12 34 567-\/89101"{}} \},}
\DoxyCodeLine{       \{ \textcolor{stringliteral}{"{}Richard Georg Strauss"{}}, \textcolor{stringliteral}{"{}+23 45 678-\/91012"{}} \},}
\DoxyCodeLine{       \{ \textcolor{stringliteral}{"{}Heitor Villa-\/Lobos"{}}, \textcolor{stringliteral}{"{}+34 56 789-\/10123"{}} \},}
\DoxyCodeLine{       \{ NULL, NULL \}}
\DoxyCodeLine{\}; \textcolor{comment}{// \_start\_entries}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \textcolor{keywordtype}{void}}
\DoxyCodeLine{\_phone\_entry\_free\_cb(\textcolor{keywordtype}{void} *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{   free(data);}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static} \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_phone\_book\_foreach\_cb(\textcolor{keyword}{const} \mbox{\hyperlink{group__Eina__Hash__Group_ga9a89d7d3ee260d3a60572ebf651b07e0}{Eina\_Hash}} *phone\_book \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}}, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *key,}
\DoxyCodeLine{                       \textcolor{keywordtype}{void} *data, \textcolor{keywordtype}{void} *fdata \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}})}
\DoxyCodeLine{\{}
\DoxyCodeLine{   \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name = key;}
\DoxyCodeLine{   \textcolor{keyword}{const} \textcolor{keywordtype}{char} *number = data;}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\%s: \%s\(\backslash\)n"{}}, name, number);}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Return EINA\_FALSE to stop this callback from being called}}
\DoxyCodeLine{   \textcolor{keywordflow}{return} \mbox{\hyperlink{group__Eina__Types__Group_ga05c12dacc8b4058994df842b41be85fc}{EINA\_TRUE}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{int}}
\DoxyCodeLine{main(\textcolor{keywordtype}{int} argc, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *argv[])}
\DoxyCodeLine{\{}
\DoxyCodeLine{   (void) argc;}
\DoxyCodeLine{   (void) argv;}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Hash__Group_ga9a89d7d3ee260d3a60572ebf651b07e0}{Eina\_Hash}} *phone\_book = NULL;}
\DoxyCodeLine{   \textcolor{keywordtype}{int} i;}
\DoxyCodeLine{   \textcolor{keyword}{const} \textcolor{keywordtype}{char} *entry\_name = \textcolor{stringliteral}{"{}Heitor Villa-\/Lobos"{}};}
\DoxyCodeLine{   \textcolor{keywordtype}{char} *phone = NULL;}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}} r;}
\DoxyCodeLine{   \mbox{\hyperlink{struct__Eina__Iterator}{Eina\_Iterator}} *it;}
\DoxyCodeLine{   \textcolor{keywordtype}{void} *data;}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Main__Group_ga81b8137665b8a4d2cb38ca50017d4c74}{eina\_init}}();}
\DoxyCodeLine{}
\DoxyCodeLine{   phone\_book = \mbox{\hyperlink{group__Eina__Hash__Group_ga9fdef2647ff77d42d2b3271c1f71030e}{eina\_hash\_string\_superfast\_new}}(\_phone\_entry\_free\_cb);}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Add initial entries to our hash}}
\DoxyCodeLine{   \textcolor{keywordflow}{for} (i = 0; \_start\_entries[i].name != NULL; i++)}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        \mbox{\hyperlink{group__Eina__Hash__Group_ga5e72d0c5397936512407ce8cd66e98d6}{eina\_hash\_add}}(phone\_book, \_start\_entries[i].name,}
\DoxyCodeLine{                      strdup(\_start\_entries[i].number));}
\DoxyCodeLine{     \}}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Look for a specific entry and get its phone number}}
\DoxyCodeLine{   phone = \mbox{\hyperlink{group__Eina__Hash__Group_ga6e9dc02a249e1fcdb64e38e7dc47afb3}{eina\_hash\_find}}(phone\_book, entry\_name);}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (phone)}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Printing entry.\(\backslash\)n"{}});}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Name: \%s\(\backslash\)n"{}}, entry\_name);}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Number: \%s\(\backslash\)n\(\backslash\)n"{}}, phone);}
\DoxyCodeLine{     \}}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Delete this entry}}
\DoxyCodeLine{   r = \mbox{\hyperlink{group__Eina__Hash__Group_ga315f85c5deae8e099e5a5a17d3557456}{eina\_hash\_del}}(phone\_book, entry\_name, NULL);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}Hash entry successfully deleted? \%d\(\backslash\)n\(\backslash\)n"{}}, r);}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Modify the pointer data of an entry and free the old one}}
\DoxyCodeLine{   phone = \mbox{\hyperlink{group__Eina__Hash__Group_ga74cea2c51afc5b5dc905bb204a562c51}{eina\_hash\_modify}}(phone\_book, \textcolor{stringliteral}{"{}Richard Georg Strauss"{}},}
\DoxyCodeLine{                            strdup(\textcolor{stringliteral}{"{}+23 45 111-\/11111"{}}));}
\DoxyCodeLine{   free(phone);}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Modify or add an entry to the hash with eina\_hash\_set}}
\DoxyCodeLine{   \textcolor{comment}{// Let's first add a new entry}}
\DoxyCodeLine{   phone = \mbox{\hyperlink{group__Eina__Hash__Group_gaec07a67481f4a4dc87f08d37a05a26f9}{eina\_hash\_set}}(phone\_book, \textcolor{stringliteral}{"{}Raul Seixas"{}},}
\DoxyCodeLine{                         strdup(\textcolor{stringliteral}{"{}+55 01 234-\/56789"{}}));}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (!phone)}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}No previous phone found for Raul Seixas. "{}});}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Creating new entry.\(\backslash\)n"{}});}
\DoxyCodeLine{     \}}
\DoxyCodeLine{   \textcolor{keywordflow}{else}}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Old phone for Raul Seixas was \%s\(\backslash\)n"{}}, phone);}
\DoxyCodeLine{        free(phone);}
\DoxyCodeLine{     \}}
\DoxyCodeLine{}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Now change the phone number}}
\DoxyCodeLine{   phone = \mbox{\hyperlink{group__Eina__Hash__Group_gaec07a67481f4a4dc87f08d37a05a26f9}{eina\_hash\_set}}(phone\_book, \textcolor{stringliteral}{"{}Raul Seixas"{}},}
\DoxyCodeLine{                         strdup(\textcolor{stringliteral}{"{}+55 02 222-\/22222"{}}));}
\DoxyCodeLine{   \textcolor{keywordflow}{if} (phone)}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Changing phone for Raul Seixas to +55 02 222-\/22222. "{}});}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Old phone was \%s\(\backslash\)n"{}}, phone);}
\DoxyCodeLine{        free(phone);}
\DoxyCodeLine{     \}}
\DoxyCodeLine{   \textcolor{keywordflow}{else}}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}No previous phone found for Raul Seixas. "{}});}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}Creating new entry.\(\backslash\)n"{}});}
\DoxyCodeLine{     \}}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// There are many ways to iterate over our Phone book.}}
\DoxyCodeLine{   \textcolor{comment}{// First, iterate showing the names and associated numbers.}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}List of phones:\(\backslash\)n"{}});}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Hash__Group_ga9237dbade8e59ac827992c7a5146cb20}{eina\_hash\_foreach}}(phone\_book, \_phone\_book\_foreach\_cb, NULL);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Now iterate using an iterator}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}List of phones:\(\backslash\)n"{}});}
\DoxyCodeLine{   it = \mbox{\hyperlink{group__Eina__Hash__Group_ga7fcb2572c843c88ac8c81b61bd9845cc}{eina\_hash\_iterator\_tuple\_new}}(phone\_book);}
\DoxyCodeLine{   \textcolor{keywordflow}{while} (\mbox{\hyperlink{group__Eina__Iterator__Group_gad870f9b1d5fb8892cb9623ad0e7f75b2}{eina\_iterator\_next}}(it, \&data))}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        \mbox{\hyperlink{struct__Eina__Hash__Tuple}{Eina\_Hash\_Tuple}} *t = data;}
\DoxyCodeLine{        \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name = t-\/>key;}
\DoxyCodeLine{        \textcolor{keyword}{const} \textcolor{keywordtype}{char} *number = t-\/>data;}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}\%s: \%s\(\backslash\)n"{}}, name, number);}
\DoxyCodeLine{     \}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Iterator__Group_ga50da005e8d26c0a043d0d1c025bc9008}{eina\_iterator\_free}}(it); \textcolor{comment}{// Always free the iterator after its use}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Just iterate over the keys (names)}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}List of names in the phone book:\(\backslash\)n"{}});}
\DoxyCodeLine{   it = \mbox{\hyperlink{group__Eina__Hash__Group_gace4ade60f125b089adc14d63232fc88c}{eina\_hash\_iterator\_key\_new}}(phone\_book);}
\DoxyCodeLine{   \textcolor{keywordflow}{while} (\mbox{\hyperlink{group__Eina__Iterator__Group_gad870f9b1d5fb8892cb9623ad0e7f75b2}{eina\_iterator\_next}}(it, \&data))}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        \textcolor{keyword}{const} \textcolor{keywordtype}{char} *name = data;}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}\%s\(\backslash\)n"{}}, name);}
\DoxyCodeLine{     \}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Iterator__Group_ga50da005e8d26c0a043d0d1c025bc9008}{eina\_iterator\_free}}(it);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Just iterate over the data (numbers)}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}List of numbers in the phone book:\(\backslash\)n"{}});}
\DoxyCodeLine{   it = \mbox{\hyperlink{group__Eina__Hash__Group_ga1fa6b5d170d65706416bfb1446d7b1b8}{eina\_hash\_iterator\_data\_new}}(phone\_book);}
\DoxyCodeLine{   \textcolor{keywordflow}{while} (\mbox{\hyperlink{group__Eina__Iterator__Group_gad870f9b1d5fb8892cb9623ad0e7f75b2}{eina\_iterator\_next}}(it, \&data))}
\DoxyCodeLine{     \{}
\DoxyCodeLine{        \textcolor{keyword}{const} \textcolor{keywordtype}{char} *number = data;}
\DoxyCodeLine{        printf(\textcolor{stringliteral}{"{}\%s\(\backslash\)n"{}}, number);}
\DoxyCodeLine{     \}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Iterator__Group_ga50da005e8d26c0a043d0d1c025bc9008}{eina\_iterator\_free}}(it);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Check how many items are in the phone book}}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}There are \%d items in the hash.\(\backslash\)n\(\backslash\)n"{}},}
\DoxyCodeLine{          \mbox{\hyperlink{group__Eina__Hash__Group_ga4bdeb2a1699703c62db697f229efe32d}{eina\_hash\_population}}(phone\_book));}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Change the name (key) on an entry}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Hash__Group_ga4b20a71099249899293d55161ef3bf35}{eina\_hash\_move}}(phone\_book, \textcolor{stringliteral}{"{}Raul Seixas"{}}, \textcolor{stringliteral}{"{}Alceu Valenca"{}});}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}List of phones after change:\(\backslash\)n"{}});}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Hash__Group_ga9237dbade8e59ac827992c7a5146cb20}{eina\_hash\_foreach}}(phone\_book, \_phone\_book\_foreach\_cb, NULL);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Empty the phone book, but don't destroy it}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Hash__Group_ga42c4cb2fb8de9a2e2ef172cf5ea736f0}{eina\_hash\_free\_buckets}}(phone\_book);}
\DoxyCodeLine{   printf(\textcolor{stringliteral}{"{}There are \%d items in the hash.\(\backslash\)n\(\backslash\)n"{}},}
\DoxyCodeLine{          \mbox{\hyperlink{group__Eina__Hash__Group_ga4bdeb2a1699703c62db697f229efe32d}{eina\_hash\_population}}(phone\_book));}
\DoxyCodeLine{}
\DoxyCodeLine{   \textcolor{comment}{// Phone book could still be used, but we are freeing it since we are}}
\DoxyCodeLine{   \textcolor{comment}{// done for now}}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Hash__Group_ga76829f09c99852b1536efc813d99fc78}{eina\_hash\_free}}(phone\_book);}
\DoxyCodeLine{}
\DoxyCodeLine{   \mbox{\hyperlink{group__Eina__Main__Group_ga5bf35513199d5220341437c05696285d}{eina\_shutdown}}();}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}
 