diff --git a/reference/csharp/eina/meson.build b/reference/csharp/eina/meson.build new file mode 100644 index 00000000..d637eabe --- /dev/null +++ b/reference/csharp/eina/meson.build @@ -0,0 +1,11 @@ +project( + 'efl-reference-eina', 'cs', + version : '0.0.1', + meson_version : '>= 0.38.0') + + +efl_mono = dependency('efl-mono', version : '>=1.20.99') +efl_mono_libs = efl_mono.get_pkgconfig_variable('mono_libs') + +subdir('src') + diff --git a/reference/csharp/eina/src/eina_array.cs b/reference/csharp/eina/src/eina_array.cs new file mode 100644 index 00000000..a81085fb --- /dev/null +++ b/reference/csharp/eina/src/eina_array.cs @@ -0,0 +1,75 @@ +/* + * Eina Array examples. + * + * These examples demonstrate how to work with eina_array data and methods. + * We use a simple array of strings to initialise our eina_array before + * performing various mutations and printing the results. + */ + +using System; + +public class Example +{ + static eina.Array CreateArray() + { + // some content to populate our array + string[] names = + { + "helo", "hera", "starbuck", "kat", "boomer", + "hotdog", "longshot", "jammer", "crashdown", "hardball", + "duck", "racetrack", "apolo", "husker", "freaker", + "skulls", "bulldog", "flat top", "hammerhead", "gonzo" + }; + + // set up an array with a growth step to give a little headroom + var array = new eina.Array(25u); + + foreach (string name in names) + array.Push(name); + + return array; + } + + static bool ItemRemoveCb(string name) + { + // let's keep any strings that are no more than 7 characters long + if (name.Length <= 7) + return false; + return true; + } + + public static void Main() + { + efl.All.Init(); + + var array = CreateArray(); + + // show the contents of our array + Console.WriteLine("Array count: {0}", array.Count()); + Console.WriteLine("Array contents:"); + foreach(string name in array) + { + // content is strings so we simply print the data + Console.WriteLine(" {0}", name); + } + + // access a specific item in the array + Console.WriteLine("Top gun: {0}", array[2]); + + // update a single item in the array + array[17] = "flattop"; + // update the array removing items that match the ItemRemoveCb criteria + // array.RemoveAll(ItemRemoveCb); // TODO: FIXME + + // print the new contents of our array + Console.WriteLine("New array count: {0}", array.Length); + Console.WriteLine("New array contents:"); + foreach(string name in array) + Console.WriteLine(" {0}", name); + + array.Dispose(); + + efl.All.Shutdown(); + } +} + diff --git a/reference/csharp/eina/src/eina_hash.cs b/reference/csharp/eina/src/eina_hash.cs new file mode 100644 index 00000000..b85bfaf0 --- /dev/null +++ b/reference/csharp/eina/src/eina_hash.cs @@ -0,0 +1,129 @@ +/* + * Eina Hash examples. + * + * These examples demonstrate how to work with eina_hash data and methods. + * + * We have two main hash objects here, firstly an int keyed hash with some + * dummy content. + * The second example is that of a simple telephone book. The names are the + * string keys to the hash with phone numbers in the data field. + */ + +using System; +using System.Collections.Generic; + +public class Example +{ + static eina.Hash CreateHash() + { + // let's create a simple hash with integers as keys + var hash = new eina.Hash(); + + // Add initial entries to our hash + for (int i = 0; i < 10; ++i) + hash.Add(i, $"The number {i}"); + + return hash; + } + + static void HashDemo() + { + var hash = CreateHash(); + + // get an iterator of the keys so we can print a line per entry + var iter = hash.Keys(); + + Console.WriteLine("Print contents of int hash"); + foreach (int key in iter) + { + // look up the value for the key so we can print both + string value = hash.Find(key); + Console.WriteLine($" Item found with id {key} has value {value}"); + } + iter.Dispose(); + Console.WriteLine(""); + + hash.Dispose(); + } + + // here we begin the phone book example + + static void PrintPhonebookEntry(string key, string data) + { + Console.WriteLine($" Name: {key}\tNumber {data}\n"); + } + + static void PrintPhonebook(eina.Hash book) + { + int count = book.Population(); + Console.WriteLine($"Complete phone book ({count}):"); + + // as an enumerator, iterate over the key and value for each entry + foreach (KeyValuePair kvp in book) + PrintPhonebookEntry(kvp.Key, kvp.Value); + + Console.WriteLine(""); + } + + static eina.Hash CreatePhonebook() + { + string[] names = + { + "Wolfgang Amadeus Mozart", "Ludwig van Beethoven", + "Richard Georg Strauss", "Heitor Villa-Lobos" + }; + string[] numbers = + { + "+01 23 456-78910", "+12 34 567-89101", + "+23 45 678-91012", "+34 56 789-10123" + }; + + // create hash of strings to strings + var hash = new eina.Hash(); + + // Add initial entries to our hash + for (int i = 0; i < 4; ++i) + hash.Add(names[i], numbers[i]); + + return hash; + } + + static void PhonebookDemo() + { + string lookup_name = "Ludwig van Beethoven"; + + var phone_book = CreatePhonebook(); + PrintPhonebook(phone_book); + + string number = phone_book.Find(lookup_name); + Console.WriteLine("Found entry:"); + PrintPhonebookEntry(lookup_name, number); + Console.WriteLine(""); + + // Let's first add a new entry + phone_book["Raul Seixas"] = "+55 01 234-56789"; + + // Change the phone number for an entry + string old_num = phone_book[lookup_name]; + phone_book[lookup_name] = "+12 34 222-22222"; + Console.WriteLine($"Old number for {lookup_name} was {old_num}\n"); + + // Change the name (key) on an entry + phone_book.Move("Raul Seixas", "Alceu Valenca"); + + Console.WriteLine("After modifications"); + PrintPhonebook(phone_book); + + phone_book.Dispose(); + } + + public static void Main() + { + efl.All.Init(); + + HashDemo(); + PhonebookDemo(); + + efl.All.Shutdown(); + } +} diff --git a/reference/csharp/eina/src/eina_iterator.cs b/reference/csharp/eina/src/eina_iterator.cs new file mode 100644 index 00000000..7033abfd --- /dev/null +++ b/reference/csharp/eina/src/eina_iterator.cs @@ -0,0 +1,78 @@ + +/* + * Eina Iterator examples. + * + * These examples demonstrate how to work with eina_iterator methods. + * Both an eina_list and an eina_array are created and an iterator obtained + * for both. You can see how we can use iterators irrespective of the source + * and also that there are different ways to work with iterating content. + */ + +using System; + +public class Example +{ + static void PrintIterator(eina.Iterator it) + { + Console.WriteLine("--iterator start--"); + foreach(string s in it) + Console.WriteLine(s); + Console.WriteLine("-- iterator end --"); + } + + static eina.Array CreateArray() + { + string[] strings = + { + "name strings", + "husker", + "starbuck", + "boomer" + }; + + var array = new eina.Array(4u); + + foreach (string s in strings) + array.Push(s); + + return array; + } + + static eina.List CreateList() + { + string[] more_strings = { + "sentence strings", + "what do your hear?", + "nothing but the rain", + "then grab your gun and bring the cat in" + }; + + var list = new eina.List(); + + foreach (string s in more_strings) + list.Append(s); + + return list; + } + + public static void Main() + { + efl.All.Init(); + + // create an eina.Array and iterate through it's contents + var array = CreateArray(); + var it = array.GetIterator(); + PrintIterator(it); + it.Dispose(); + array.Dispose(); + + // perform the same iteration with an eina.List + var list = CreateList(); + it = list.GetIterator(); + PrintIterator(it); + it.Dispose(); + list.Dispose(); + + efl.All.Shutdown(); + } +} diff --git a/reference/csharp/eina/src/eina_list.cs b/reference/csharp/eina/src/eina_list.cs new file mode 100644 index 00000000..b1ddfef7 --- /dev/null +++ b/reference/csharp/eina/src/eina_list.cs @@ -0,0 +1,71 @@ + +/* + * Eina List examples. + * + * These examples demonstrate how to work with eina_list data and methods. + * We create a simple list of names by appending strings to an empty list + * and then run various mutations and print each result. + */ + +using System; +using System.Linq; + +public class Example +{ + static eina.List CreateList() + { + var list = new eina.List(); + + list.Append("Adama"); + list.Append("Baltar"); + list.Append("Roslin"); + + return list; + } + + public static void Main() + { + efl.All.Init(); + + var list = CreateList(); + + // print our list with a simple foreach + Console.WriteLine("List size: {0}", list.Count()); + Console.WriteLine("List content:"); + foreach(string item in list) + Console.WriteLine(" {0}", item); + + // insert some more elements + list.Prepend("Cain"); +// list.PrependRelative("Tigh", "Baltar"); // TODO: missing + + Console.WriteLine("New list content:"); + foreach(string item in list) + Console.WriteLine(" {0}", item); + + // promote an item to the top of the list + // TODO: implement ? +// list.PromoteList(list.NthList(1)); +// list.Remove("Cain"); +// +// Console.WriteLine("List content after promotion:"); +// foreach(string item in list) +// Console.WriteLine(" {0}", item); + + // we can sort the list with any callback +// list.Sort((string strA, string strB) => { return strA.Compare(strB); }); // TODO: FIXME custom sort + list.Sort(); + Console.WriteLine("List content sorted:"); + foreach(string item in list) + Console.WriteLine(" {0}", item); + + // and foreach can be in reverse too + Console.WriteLine("List content reverse sorted:"); + foreach(string item in list.Reverse()) + Console.WriteLine(" {0}", item); + + list.Dispose(); + + efl.All.Shutdown(); + } +} diff --git a/reference/csharp/eina/src/eina_log.cs b/reference/csharp/eina/src/eina_log.cs new file mode 100644 index 00000000..ca8cce88 --- /dev/null +++ b/reference/csharp/eina/src/eina_log.cs @@ -0,0 +1,62 @@ + +/* + * Efl Core Log examples. + * + * This demo shows how to log at various levels and to change what log is shown. + * You can also use a custom log printer in your app as shown in _log_custom. + */ + +using System; + +public class Example +{ + static double Divide(int num, int denom) + { + if (denom == 0) + eina.Log.Critical("Attempt to divide by 0\n"); + else + { + if (denom < 0) + eina.Log.Warning("Possible undesirable effect, divide by negative number"); + + double ret = ((double) num / denom); + eina.Log.Info($"{num} / {denom} = {ret}\n"); + return ret; + } + + return -1; + } + + static void Divides() + { + Divide(5, 1); + Divide(5, -1); + Divide(5, 0); + } + + static void LogLevels() + { + Console.WriteLine("Executing with default logging"); + Divides(); + + eina.Log.GlobalLevelSet(eina.Log.Level.Warning); + Console.WriteLine("Executing with Warning level"); // same as EINA_LOG_LEVEL = 2 + Divides(); + + eina.Log.GlobalLevelSet(eina.Log.Level.Info); + Console.WriteLine("Executing with Info on"); // same as EINA_LOG_LEVEL = 3 + Divides(); + } + + public static void Main() + { + efl.All.Init(); + + LogLevels(); + + // TODO: missing + //LogCustom(); + + efl.All.Shutdown(); + } +} diff --git a/reference/csharp/eina/src/eina_value.cs b/reference/csharp/eina/src/eina_value.cs new file mode 100644 index 00000000..f4ec556c --- /dev/null +++ b/reference/csharp/eina/src/eina_value.cs @@ -0,0 +1,93 @@ + +/* + * Eina Value examples. + * + * These examples demonstrate how to work with eina_value data and methods. + * Eina_Value is a way to represent and pass data of varying types and to + * convert efficiently between them.. + * Eina_Value can even define structs for managing more complex requirements. + */ + +using System; + +public class Example +{ + static void ValueInt() + { + int i; + + // Setting up an integer value type + var int_val = new eina.Value(eina.ValueType.Int32); + int_val.Set(123); + int_val.Get(out i); + Console.WriteLine("int_val value is {0}", i); + + // It can easily be converted it to a string + string str = int_val.ToString(); + Console.WriteLine("int_val to string is \"{0}\"", str); + int_val.Flush(); + } + + static void ValueString() + { + string str; + + // Setting up an string value type + var str_val = new eina.Value(eina.ValueType.String); + str_val.Set("My string"); + str_val.Get(out str); + Console.WriteLine("str_val value is \"{0}\"", str); + + // To string should have the same content + string newstr = str_val.ToString(); + Console.WriteLine("str_val to string is \"{0}\"", newstr); + str_val.Flush(); + } + + static void ValueConvert() + { + // set up string and int types to convert between + var str_val = new eina.Value(eina.ValueType.String); + var int_val = new eina.Value(eina.ValueType.Int32); + + // convert from int to string: + int i1; + string str1; + int_val.Set(123); + int_val.Get(out i1); + int_val.ConvertTo(str_val); + str_val.Get(out str1); + Console.WriteLine("int_val was {0}, converted to string is \"{1}\"", i1, str1); + + // and the other way around! + int i2; + string str2; + str_val.Set("33"); + str_val.Get(out str2); + str_val.ConvertTo(int_val); + int_val.Get(out i2); + Console.WriteLine("str_val was \"{0}\", converted to int is {1}", str2, i2); + + str_val.Flush(); + int_val.Flush(); + } + + public static void Main() + { + efl.All.Init(); + + ValueInt(); + Console.WriteLine(""); + + ValueString(); + Console.WriteLine(""); + + ValueConvert(); + Console.WriteLine(""); + + // TODO: FIXME + // ValueStruct(); + + efl.All.Shutdown(); + } +} diff --git a/reference/csharp/eina/src/meson.build b/reference/csharp/eina/src/meson.build new file mode 100644 index 00000000..a0ebaf16 --- /dev/null +++ b/reference/csharp/eina/src/meson.build @@ -0,0 +1,43 @@ +deps = [efl_mono] + +executable('efl_reference_eina_array', + files(['eina_array.cs']), + dependencies : deps, + cs_args : efl_mono_libs, + install : true +) + +executable('efl_reference_eina_list', + files(['eina_list.cs']), + dependencies : deps, + cs_args : efl_mono_libs, + install : true +) + +executable('efl_reference_eina_iterator', + files(['eina_iterator.cs']), + dependencies : deps, + cs_args : efl_mono_libs, + install : true +) + +executable('efl_reference_eina_hash', + files(['eina_hash.cs']), + dependencies : deps, + cs_args : efl_mono_libs, + install : true +) + +executable('efl_reference_eina_value', + files(['eina_value.cs']), + dependencies : deps, + cs_args : efl_mono_libs, + install : true +) + +executable('efl_reference_eina_log', + files(['eina_log.cs']), + dependencies : deps, + cs_args : efl_mono_libs, + install : true +)