efl/src/bindings/mono/eina_mono/eina_value.cs

3645 lines
116 KiB
C#
Raw Normal View History

/*
* Copyright 2019 by its authors. See AUTHORS.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma warning disable 1591
#define CODE_ANALYSIS
using System;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Security.Permissions;
using System.Security;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
using static Eina.EinaNative.UnsafeNativeMethods;
using static Eina.TraitFunctions;
namespace Eina
{
namespace EinaNative
{
// Structs to be passed from/to C when dealing with containers and
// optional values.
[StructLayout(LayoutKind.Sequential)]
[EditorBrowsable(EditorBrowsableState.Never)]
struct Value_Array
{
public IntPtr subtype;
public uint step;
public IntPtr subarray;
}
[StructLayout(LayoutKind.Sequential)]
[EditorBrowsable(EditorBrowsableState.Never)]
struct Value_List
{
public IntPtr subtype;
public IntPtr sublist;
}
[SuppressUnmanagedCodeSecurityAttribute]
[EditorBrowsable(EditorBrowsableState.Never)]
static internal class UnsafeNativeMethods
{
[DllImport(efl.Libs.Eina)]
internal static extern IntPtr eina_value_new(IntPtr type);
[DllImport(efl.Libs.Eina)]
internal static extern void eina_value_free(IntPtr type);
[DllImport(efl.Libs.Eina)]
internal static extern IntPtr eina_value_type_name_get(IntPtr type);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_convert(IntPtr handle, IntPtr convert);
// Wrapped and helper methods
[DllImport(efl.Libs.CustomExports)]
internal static extern int eina_value_sizeof();
[DllImport(efl.Libs.CustomExports, CharSet=CharSet.Ansi)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_string(IntPtr handle, string value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_uchar(IntPtr handle, byte value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_char(IntPtr handle, sbyte value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_short(IntPtr handle, short value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_ushort(IntPtr handle, ushort value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_int(IntPtr handle, int value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_uint(IntPtr handle, uint value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_long(IntPtr handle, long value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_ulong(IntPtr handle, ulong value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_float(IntPtr handle, float value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_double(IntPtr handle, double value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_set_wrapper_ptr(IntPtr handle, IntPtr value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_setup_wrapper(IntPtr handle, IntPtr type);
[DllImport(efl.Libs.CustomExports)]
internal static extern void eina_value_flush_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr eina_value_type_get_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out IntPtr output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out Value_List output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out Value_Array output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out byte output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out sbyte output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out short output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out ushort output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out int output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out uint output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out long output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out ulong output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out float output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_get_wrapper(IntPtr handle, out double output);
[DllImport(efl.Libs.CustomExports)]
internal static extern int eina_value_compare_wrapper(IntPtr handle, IntPtr other);
[DllImport(efl.Libs.Eina, CharSet=CharSet.Ansi)]
[return:
MarshalAs(UnmanagedType.CustomMarshaler,
MarshalTypeRef=typeof(Efl.Eo.StringPassOwnershipMarshaler))]
internal static extern string eina_value_to_string(IntPtr handle); // We take ownership of the returned string.
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_array_setup_wrapper(IntPtr handle, IntPtr subtype, uint step);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_list_setup_wrapper(IntPtr handle, IntPtr subtype);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_string(IntPtr handle, string data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_ptr(IntPtr handle, IntPtr data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_char(IntPtr handle, sbyte data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_uchar(IntPtr handle, byte data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_short(IntPtr handle, short data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_ushort(IntPtr handle, ushort data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_int(IntPtr handle, int data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_uint(IntPtr handle, uint data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_long(IntPtr handle, long data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_ulong(IntPtr handle, ulong data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_float(IntPtr handle, float data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_append_wrapper_double(IntPtr handle, double data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_list_append_wrapper(IntPtr handle, IntPtr data);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out IntPtr output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out sbyte output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out byte output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out short output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out ushort output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out int output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out uint output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out long output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out ulong output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out float output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_get_wrapper(IntPtr handle, int index, out double output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_list_get_wrapper(IntPtr handle, int index, out IntPtr output);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_string(IntPtr handle, int index, string value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_ptr(IntPtr handle, int index, IntPtr value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_uchar(IntPtr handle, int index, byte value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_char(IntPtr handle, int index, sbyte value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_short(IntPtr handle, int index, short value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_ushort(IntPtr handle, int index, ushort value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_int(IntPtr handle, int index, int value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_uint(IntPtr handle, int index, uint value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_long(IntPtr handle, int index, long value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_ulong(IntPtr handle, int index, ulong value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_float(IntPtr handle, int index, float value);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_container_set_wrapper_double(IntPtr handle, int index, double value);
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr eina_value_array_subtype_get_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr eina_value_list_subtype_get_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
internal static extern uint eina_value_array_count_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
internal static extern uint eina_value_list_count_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_empty_is_wrapper(IntPtr handle, [MarshalAsAttribute(UnmanagedType.U1)] out bool empty);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref byte value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref sbyte value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref short value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref ushort value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref int value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref uint value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref long value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref ulong value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref float value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref double value);
[DllImport(efl.Libs.Eina, CharSet=CharSet.Ansi)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref string value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, ref IntPtr value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pset(IntPtr handle, IntPtr subtype, IntPtr value);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_reset(IntPtr handle);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
internal static extern bool eina_value_optional_pget(IntPtr handle, out Eina.EinaNative.Value_Array output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
internal static extern bool eina_value_optional_pget(IntPtr handle, out Eina.EinaNative.Value_List output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out IntPtr output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out byte output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out sbyte output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out short output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out ushort output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out int output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out uint output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out long output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out ulong output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out float output);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_optional_pget(IntPtr handle, out double output);
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr eina_value_optional_type_get_wrapper(IntPtr handle);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
internal static extern bool eina_value_pset_wrapper(IntPtr handle, ref Eina.EinaNative.Value_Array ptr);
[DllImport(efl.Libs.CustomExports)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
internal static extern bool eina_value_pset_wrapper(IntPtr handle, ref Eina.EinaNative.Value_List ptr);
[DllImport(efl.Libs.Eina)]
[return: MarshalAsAttribute(UnmanagedType.U1)]
internal static extern bool eina_value_copy(IntPtr src, IntPtr dest);
// Supported types
// 8 bits byte
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_byte();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_sbyte();
// 16 bits short
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_short();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_ushort();
// 32 bits ints
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_int32();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_uint32();
// 64 bit longs
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_long();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_ulong();
// In C# long and int 64 are synonyms, but in Eina Value they are separate types.
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_int64();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_uint64();
// Floating point
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_float();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_double();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_string();
// Collections
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_array();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_list();
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_hash();
// Optional
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_optional();
// Error
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_error();
// Error
[DllImport(efl.Libs.CustomExports)]
internal static extern IntPtr type_object();
}
}
/// <summary>Struct for passing Values by value to Unmanaged functions.
///
/// <para>Used internally by the marshalling code.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
[StructLayout(LayoutKind.Sequential)]
[EditorBrowsable(EditorBrowsableState.Never)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
public struct ValueNative
{
public IntPtr Type;
public IntPtr Value; // Actually an Eina_Value_Union, but it is padded to 8 bytes.
public override string ToString()
{
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
return $"ValueNative<Type:0x{Type.ToInt64():x}, Value:0x{Value.ToInt64():x}>";
}
}
/// <summary>Exception for failures when setting an container item.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
[Serializable]
public class SetItemFailedException : Exception
{
/// <summary>
/// Default constructor.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
public SetItemFailedException() : base()
{
}
/// <summary>
/// Most commonly used contructor. Allows setting a custom message.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="msg">The message of the exception.</param>
public SetItemFailedException(string msg) : base(msg)
{
}
/// <summary>
/// Wraps an inner exception.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="msg">The message of the exception.</param>
/// <param name="inner">The exception to be wrapped.</param>
public SetItemFailedException(string msg, Exception inner) : base(msg, inner)
{
}
/// <summary>
/// Serializable constructor.
///
/// <para>Since EFL 1.23.</para>
/// <param name="info">Serialized object data about the exception.</param>
/// <param name="context">Contextual information about the source or destination.</param>
/// </summary>
protected SetItemFailedException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
/// <summary>Exception for methods that must have been called on a container.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
[Serializable]
public class InvalidValueTypeException: Exception
{
/// <summary>
/// Default constructor.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
public InvalidValueTypeException() : base()
{
}
/// <summary>
/// Most commonly used contructor. Allows setting a custom message.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="msg">The message of the exception.</param>
public InvalidValueTypeException(string msg) : base(msg)
{
}
/// <summary>
/// Wraps an inner exception.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="msg">The message of the exception.</param>
/// <param name="inner">The exception to be wrapped.</param>
public InvalidValueTypeException(string msg, Exception inner) : base(msg, inner)
{
}
/// <summary>
/// Serializable constructor.
///
/// <para>Since EFL 1.23.</para>
/// <param name="info">Serialized object data about the exception.</param>
/// <param name="context">Contextual information about the source or destination.</param>
/// </summary>
protected InvalidValueTypeException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
/// <summary>Managed-side Enum to represent Eina_Value_Type constants.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
public enum ValueType
{
/// <summary>Signed 8 bit integer. Same as 'sbyte'.
/// <para>Since EFL 1.23.</para>
/// </summary>
SByte,
/// <summary>Unsigned 8 bit integer. Same as 'byte'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Byte,
/// <summary>Signed 16 bit integer. Same as 'short'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Short,
/// <summary>Unsigned 16 bit integer. Same as 'ushort'.
/// <para>Since EFL 1.23.</para>
/// </summary>
UShort,
/// <summary>Signed 32 bit integer. Same as 'int'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Int32,
/// <summary>Unsigned 32 bit integer. Same as 'uint'.
/// <para>Since EFL 1.23.</para>
/// </summary>
UInt32,
/// <summary>Signed long integer. Same as 'long'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Long,
/// <summary>Unsigned long integer. Same as 'ulong'.
/// <para>Since EFL 1.23.</para>
/// </summary>
ULong,
/// <summary>Signed 64 bit integer. Same as 'long'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Int64,
/// <summary>Unsigned 64 bit integer. Same as 'ulong'.
/// <para>Since EFL 1.23.</para>
/// </summary>
UInt64,
/// <summary>4-byte float. Same as 'float'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Float,
/// <summary>8-byte double. Same as 'double'.
/// <para>Since EFL 1.23.</para>
/// </summary>
Double,
/// <summary>Strings.
/// <para>Since EFL 1.23.</para>
/// </summary>
String,
/// <summary>Array of Value items.
/// <para>Since EFL 1.23.</para>
/// </summary>
Array,
/// <summary>Linked list of Value items.
/// <para>Since EFL 1.23.</para>
/// </summary>
List,
/// <summary>Map of string keys to Value items.
/// <para>Since EFL 1.23.</para>
/// </summary>
Hash,
/// <summary>Optional (aka empty) values.
/// <para>Since EFL 1.23.</para>
/// </summary>
Optional,
/// <summary>Error values.
/// <para>Since EFL 1.23.</para>
/// </summary>
Error,
/// <summary>Eo Object values.
/// <para>Since EFL 1.23.</para>
/// </summary>
Object,
/// <summary>Empty values.
/// <para>Since EFL 1.23.</para>
/// </summary>
Empty,
}
/// <summary>Extension methods for <see cref="Eina.ValueType" />.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
static class ValueTypeMethods
{
/// <summary>Checks if this type is a numeric value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>Whether this type is a numeric one.</returns>
public static bool IsNumeric(this ValueType val)
{
switch (val)
{
case ValueType.SByte:
case ValueType.Byte:
case ValueType.Short:
case ValueType.UShort:
case ValueType.Int32:
case ValueType.UInt32:
case ValueType.Long:
case ValueType.ULong:
case ValueType.Int64:
case ValueType.UInt64:
case ValueType.Float:
case ValueType.Double:
return true;
default:
return false;
}
}
/// <summary>Checks if this type is a string value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>Whether this type is a string.</returns>
public static bool IsString(this ValueType val)
{
switch (val)
{
case ValueType.String:
return true;
default:
return false;
}
}
/// <summary>Checks if this type is a container value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>Whether this type is a container.</returns>
public static bool IsContainer(this ValueType val)
{
switch (val)
{
case ValueType.Array:
case ValueType.List:
case ValueType.Hash:
return true;
default:
return false;
}
}
/// <summary>Checks if this type is optional. (i.e. can be empty).
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>Whether this type is optional.</returns>
public static bool IsOptional(this ValueType val)
{
return val == ValueType.Optional;
}
/// <summary>Checks if this type represents an error value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>Whether this type is a error one.</returns>
public static bool IsError(this ValueType val)
{
return val == ValueType.Error;
}
/// <summary>Checks if this type is an <see cref="Efl.Object" />.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>Whether this type is an <see cref="Efl.Object" />.</returns>
public static bool IsObject(this ValueType val)
{
return val == ValueType.Object;
}
/// <summary>Returns the Marshal.SizeOf for the given ValueType native structure.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public static int MarshalSizeOf(this ValueType val)
{
switch (val)
{
case ValueType.Array:
return Marshal.SizeOf(typeof(EinaNative.Value_Array));
case ValueType.List:
return Marshal.SizeOf(typeof(EinaNative.Value_List));
default:
return 0;
}
}
}
/// <summary>Boxing class for custom marshalling of ValueType enums.
///
/// <para>As custom marshalling of enums (and other value types) is not supported, use
/// use this boxing class as an intermediate at the Marshalling API level (like in
/// marshall_type_impl.hh in the generator). User-facing API still uses Eina.ValueType
/// normally.</para>
///
/// Since EFL 1.23.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class ValueTypeBox
{
public ValueType _payload;
public ValueTypeBox(ValueType v)
{
_payload = v;
}
public static implicit operator ValueTypeBox(ValueType v)
{
return new ValueTypeBox(v);
}
public static implicit operator ValueType(ValueTypeBox box)
{
if (box == null)
{
return Eina.ValueType.Empty;
}
return box._payload;
}
}
internal static class ValueTypeBridge
{
private static Dictionary<ValueType, IntPtr> ManagedToNative = new Dictionary<ValueType, IntPtr>();
private static Dictionary<IntPtr, ValueType> NativeToManaged = new Dictionary<IntPtr, ValueType>();
private static Dictionary<System.Type, ValueType> StandardToManaged = new Dictionary<System.Type, ValueType>();
private static Dictionary<ValueType, System.Type> ManagedToStandard = new Dictionary<ValueType, System.Type>();
private static bool TypesLoaded; // CLR defaults to false;
public static ValueType GetManaged(IntPtr native)
{
if (!TypesLoaded)
{
LoadTypes();
}
try
{
return NativeToManaged[native];
}
catch (KeyNotFoundException)
{
var name_ptr = eina_value_type_name_get(native);
var name = Marshal.PtrToStringAnsi(name_ptr);
throw new Efl.EflException($"Unknown native eina value Type: 0x{native.ToInt64():x} with name {name}");
}
}
public static IntPtr GetNative(ValueType valueType)
{
if (!TypesLoaded)
{
LoadTypes();
}
return ManagedToNative[valueType];
}
/// <summary>Returns the Eina.Value type associated with the given C# type.</summary>
public static ValueType GetManaged(System.Type type)
{
ValueType v;
if (StandardToManaged.TryGetValue(type, out v))
{
return v;
}
else
{
if (typeof(Efl.Object).IsAssignableFrom(type))
{
return ValueType.Object;
}
throw new Efl.EflException($"Unknown value type mapping for C# type {type}");
}
}
/// <summary>Returns the System.Type associated with the given Eina.Value type.</summary>
/// <param name="valueType">The intermediate type as returned by <see cref="Eina.Value.GetValueType()" />.</param>
/// <returns>The associated C# type with this value type.</returns>
public static System.Type GetStandard(ValueType valueType)
{
System.Type ret = null;
if (ManagedToStandard.TryGetValue(valueType, out ret))
{
return ret;
}
else
{
throw new Efl.EflException($"Unknown C# type mapping for value type {valueType}");
}
}
private static void LoadTypes()
{
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
Eina.Config.Init(); // Make sure eina is initialized.
ManagedToNative.Add(ValueType.SByte, type_sbyte());
NativeToManaged.Add(type_sbyte(), ValueType.SByte);
StandardToManaged.Add(typeof(sbyte), ValueType.SByte);
ManagedToStandard.Add(ValueType.SByte, typeof(sbyte));
ManagedToNative.Add(ValueType.Byte, type_byte());
NativeToManaged.Add(type_byte(), ValueType.Byte);
StandardToManaged.Add(typeof(byte), ValueType.Byte);
ManagedToStandard.Add(ValueType.Byte, typeof(byte));
ManagedToNative.Add(ValueType.Short, type_short());
NativeToManaged.Add(type_short(), ValueType.Short);
StandardToManaged.Add(typeof(short), ValueType.Short);
ManagedToStandard.Add(ValueType.Short, typeof(short));
ManagedToNative.Add(ValueType.UShort, type_ushort());
NativeToManaged.Add(type_ushort(), ValueType.UShort);
StandardToManaged.Add(typeof(ushort), ValueType.UShort);
ManagedToStandard.Add(ValueType.UShort, typeof(ushort));
ManagedToNative.Add(ValueType.Int32, type_int32());
NativeToManaged.Add(type_int32(), ValueType.Int32);
StandardToManaged.Add(typeof(int), ValueType.Int32);
ManagedToStandard.Add(ValueType.Int32, typeof(int));
ManagedToNative.Add(ValueType.UInt32, type_uint32());
NativeToManaged.Add(type_uint32(), ValueType.UInt32);
StandardToManaged.Add(typeof(uint), ValueType.UInt32);
ManagedToStandard.Add(ValueType.UInt32, typeof(uint));
ManagedToNative.Add(ValueType.Long, type_long());
NativeToManaged.Add(type_long(), ValueType.Long);
ManagedToStandard.Add(ValueType.Long, typeof(long));
ManagedToNative.Add(ValueType.ULong, type_ulong());
NativeToManaged.Add(type_ulong(), ValueType.ULong);
ManagedToStandard.Add(ValueType.ULong, typeof(ulong));
ManagedToNative.Add(ValueType.Int64, type_int64());
NativeToManaged.Add(type_int64(), ValueType.Int64);
StandardToManaged.Add(typeof(long), ValueType.Int64);
ManagedToStandard.Add(ValueType.Int64, typeof(long));
ManagedToNative.Add(ValueType.UInt64, type_uint64());
NativeToManaged.Add(type_uint64(), ValueType.UInt64);
StandardToManaged.Add(typeof(ulong), ValueType.UInt64);
ManagedToStandard.Add(ValueType.UInt64, typeof(ulong));
ManagedToNative.Add(ValueType.Float, type_float());
NativeToManaged.Add(type_float(), ValueType.Float);
StandardToManaged.Add(typeof(float), ValueType.Float);
ManagedToStandard.Add(ValueType.Float, typeof(float));
ManagedToNative.Add(ValueType.Double, type_double());
NativeToManaged.Add(type_double(), ValueType.Double);
StandardToManaged.Add(typeof(double), ValueType.Double);
ManagedToStandard.Add(ValueType.Double, typeof(double));
ManagedToNative.Add(ValueType.String, type_string());
NativeToManaged.Add(type_string(), ValueType.String);
StandardToManaged.Add(typeof(string), ValueType.String);
ManagedToStandard.Add(ValueType.String, typeof(string));
ManagedToNative.Add(ValueType.Array, type_array());
NativeToManaged.Add(type_array(), ValueType.Array);
ManagedToNative.Add(ValueType.List, type_list());
NativeToManaged.Add(type_list(), ValueType.List);
ManagedToNative.Add(ValueType.Hash, type_hash());
NativeToManaged.Add(type_hash(), ValueType.Hash);
ManagedToNative.Add(ValueType.Optional, type_optional());
NativeToManaged.Add(type_optional(), ValueType.Optional);
ManagedToNative.Add(ValueType.Error, type_error());
NativeToManaged.Add(type_error(), ValueType.Error);
StandardToManaged.Add(typeof(Eina.Error), ValueType.Error);
ManagedToStandard.Add(ValueType.Error, typeof(Eina.Error));
ManagedToNative.Add(ValueType.Object, type_object());
NativeToManaged.Add(type_object(), ValueType.Object);
// We don't use `typeof(Efl.Object)` directly in the StandartToManaged dictionary as typeof(myobj) may
// return a different type. For ManagedToStandard, we make use of C# generics covariance to create
// an collection of Efl.Objects when unwrapping.
ManagedToStandard.Add(ValueType.Object, typeof(Efl.Object));
ManagedToNative.Add(ValueType.Empty, IntPtr.Zero);
NativeToManaged.Add(IntPtr.Zero, ValueType.Empty);
TypesLoaded = true;
}
}
/// <summary>Wrapper around Eina.Value generic storage.
///
/// <para>Eina.Value is EFL's main workhorse to deal with storing generic data in
/// a uniform way.</para>
///
/// <para>It comes with predefined types for numbers, strings, arrays, lists, hashes,
/// blobs and structs. It is able to convert between data types, including
/// to and from strings.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
public class Value : IDisposable, IComparable<Value>, IEquatable<Value>
{
// Unmanaged type - Managed type mapping
// Ok EINA_VALUE_TYPE_UCHAR: unsigned char -- byte
// Ok EINA_VALUE_TYPE_USHORT: unsigned short -- ushort
// Ok EINA_VALUE_TYPE_UINT: unsigned int -- uint
// Ok EINA_VALUE_TYPE_ULONG: unsigned long -- ulong
// Ok EINA_VALUE_TYPE_UINT64: uint64_t -- ulong
// Ok EINA_VALUE_TYPE_CHAR: char -- sbyte
// Ok EINA_VALUE_TYPE_SHORT: short -- short
// Ok EINA_VALUE_TYPE_INT: int -- int
// Ok EINA_VALUE_TYPE_LONG: long -- long
// OK EINA_VALUE_TYPE_INT64: int64_t -- long
// Ok EINA_VALUE_TYPE_FLOAT: float -- float
// Ok EINA_VALUE_TYPE_DOUBLE: double -- double
// EINA_VALUE_TYPE_STRINGSHARE: const char * -- string
// Ok EINA_VALUE_TYPE_STRING: const char * -- string
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
// Ok EINA_VALUE_TYPE_ARRAY: Eina_Value_Array -- Eina.Array?
// Ok EINA_VALUE_TYPE_LIST: Eina_Value_List -- Eina.List?
// EINA_VALUE_TYPE_HASH: Eina_Value_Hash -- Eina.Hash?
// EINA_VALUE_TYPE_TIMEVAL: struct timeval -- FIXME
// EINA_VALUE_TYPE_BLOB: Eina_Value_Blob -- FIXME
// EINA_VALUE_TYPE_STRUCT: Eina_Value_Struct -- FIXME
internal IntPtr Handle { get; set;}
/// <summary> Whether this wrapper owns (can free) the native value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <value>The kind of ownership of this wrapper.</value>
public Ownership Ownership { get; protected set;}
private bool Disposed;
/// <summary> Whether this is an Optional value (meaning it can have a value or not).
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <value>True if this value may contain no value.</value>
public bool Optional
{
get
{
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
return GetValueType() == Eina.ValueType.Optional;
}
/* protected set {
// Should we expose this?
// Something like {
// flush(handle)/free(handle)
// handle = eina_value_optional_empty_new()
// }
} */
}
/// <summary> Whether this wrapper is actually empty/uninitialized (zeroed).
///
/// <para>This is different from an <see cref="Eina.ValueType.Optional" /> value. An
/// <c>Optional</c> value is an initialized value that may or may not hold a value,
/// while an <see cref="Eina.ValueType.Empty" /> value is an uninitialized value and it
/// should be initialized (e.g. with <see cref="Eina.Value.Setup(Eina.ValueType)" />)
/// with a non-empty value to actually store/retrieve values.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <value><c>true</c> if this value is unintialized.</value>
public bool Empty
{
get
{
SanityChecks();
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
return GetValueType() == Eina.ValueType.Empty;
}
}
/// <summary> Whether this optional value is empty.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <value><c>true</c> if this optional value is empty.</value>
public bool OptionalEmpty
{
get
{
OptionalSanityChecks();
bool empty;
if (!eina_value_optional_empty_is_wrapper(this.Handle, out empty))
{
throw new System.InvalidOperationException("Couldn't get the empty information");
}
else
{
return empty;
}
}
}
private static IntPtr Alloc()
{
return eina_value_new(type_int32());
}
private static void Free(IntPtr ptr)
{
eina_value_free(ptr);
}
// Constructor to be used by the "FromContainerDesc" methods.
private Value()
{
this.Handle = Alloc();
if (this.Handle == IntPtr.Zero)
{
throw new OutOfMemoryException("Failed to allocate memory for Eina.Value");
}
this.Ownership = Ownership.Managed;
MemoryNative.Memset(this.Handle, 0, eina_value_sizeof());
}
/// <summary>Creates a new Value from the given C# value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="obj">The object to be wrapped.</param>
public Value(object obj) : this()
{
var objType = obj.GetType();
if (objType == typeof(sbyte))
{
Setup(ValueType.SByte);
Set((sbyte)obj);
}
else if (objType == typeof(byte))
{
Setup(ValueType.Byte);
Set((byte)obj);
}
else if (objType == typeof(short))
{
Setup(ValueType.Short);
Set((short)obj);
}
else if (objType == typeof(ushort))
{
Setup(ValueType.UShort);
Set((ushort)obj);
}
else if (objType == typeof(int))
{
Setup(ValueType.Int32);
Set((int)obj);
}
else if (objType == typeof(uint))
{
Setup(ValueType.UInt32);
Set((uint)obj);
}
else if (objType == typeof(long))
{
Setup(ValueType.Int64);
Set((long)obj);
}
else if (objType == typeof(ulong))
{
Setup(ValueType.UInt64);
Set((ulong)obj);
}
else if (objType == typeof(float))
{
Setup(ValueType.Float);
Set((float)obj);
}
else if (objType == typeof(double))
{
Setup(ValueType.Double);
Set((double)obj);
}
else if (objType == typeof(string))
{
Setup(ValueType.String);
Set(obj as string);
}
else if (typeof(Efl.Object).IsAssignableFrom(objType))
{
Setup(ValueType.Object);
Set(obj as Efl.Object);
}
else
{
// Container type conversion is supported only from IEnumerable<T>
if (!obj.GetType().GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
{
throw new ArgumentException($"Unsupported type for direct construction: {objType}");
}
Type[] genericArguments = objType.GetGenericArguments();
if (genericArguments.Count() != 1)
{
throw new ArgumentException($"Unsupported type for direct construction: {objType}");
}
var genericArg = genericArguments[0];
var argValueType = ValueTypeBridge.GetManaged(genericArg);
Setup(ValueType.Array, argValueType);
foreach (var item in obj as System.Collections.IEnumerable)
{
Append(item);
}
}
}
/// <summary>Creates a new Value from the given native pointer.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public Value(IntPtr handle, Ownership ownership = Ownership.Managed)
{
this.Handle = handle;
this.Ownership = ownership;
}
/// <summary>Creates a new value storage for values of type <c>type</c>.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="type">The type of the value that will be stored.</param>
public Value(ValueType type)
{
if (type.IsContainer())
{
throw new ArgumentException("To use container types you must provide a subtype");
}
this.Handle = Alloc();
if (this.Handle == IntPtr.Zero)
{
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
throw new OutOfMemoryException("Failed to allocate memory for Eina.Value");
}
// Initialize to EINA_VALUE_EMPTY before performing any other operation on this value.
MemoryNative.Memset(this.Handle, 0, eina_value_sizeof());
this.Ownership = Ownership.Managed;
Setup(type);
}
/// <summary>Constructor for container values, like Array, Hash. It also requires an extra parameter
/// with the type of the contained items.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="containerType">The type of the container to store values.</param>
/// <param name="subtype">The type of the values contained.</param>
/// <param name="step">Amount to increase the capacity of the container by when it needs to grow.</param>
public Value(ValueType containerType, ValueType subtype, uint step = 0)
{
if (!containerType.IsContainer())
{
throw new ArgumentException("First type must be a container type.");
}
this.Handle = Alloc();
this.Ownership = Ownership.Managed;
Setup(containerType, subtype, step);
}
/// <summary>Deep copies the given eina Value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="v">The value to be copied.</param>
public Value(Value v)
{
Handle = Alloc();
if (!eina_value_copy(v.Handle, this.Handle))
{
throw new System.InvalidOperationException("Failed to copy value to managed memory.");
}
Disposed = false;
Ownership = Ownership.Managed;
}
/// <summary>Constructor to build value from Values_Natives passed by value from C.</summary>
internal Value(ValueNative value)
{
IntPtr tmp = IntPtr.Zero;
try
{
this.Handle = Alloc();
if (value.Type == IntPtr.Zero) // Got an EINA_VALUE_EMPTY by value.
{
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
MemoryNative.Memset(this.Handle, 0, Marshal.SizeOf(typeof(ValueNative)));
}
else
{
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
// We allocate this intermediate ValueNative using malloc to allow freeing with
// free(), avoiding a call to eina_value_flush that would wipe the underlying value contents
// for pointer types like string.
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
tmp = MemoryNative.Alloc(Marshal.SizeOf(typeof(ValueNative)));
Marshal.StructureToPtr<ValueNative>(value, tmp, false); // Can't get the address of a struct directly.
// Copy is used to deep copy the pointed payload (e.g. strings) inside this struct, so we can own this value.
if (!eina_value_copy(tmp, this.Handle))
{
throw new System.InvalidOperationException("Failed to copy value to managed memory.");
}
}
}
catch
{
Free(this.Handle);
throw;
}
finally
{
if (tmp != IntPtr.Zero)
{
MemoryNative.Free(tmp);
}
}
this.Ownership = Ownership.Managed;
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(byte x) : this(ValueType.Byte)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(sbyte x) : this(ValueType.SByte)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(short x) : this(ValueType.Short)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(ushort x) : this(ValueType.UShort)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(int x) : this(ValueType.Int32)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(uint x) : this(ValueType.UInt32)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(long x) : this(ValueType.Long)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(ulong x) : this(ValueType.ULong)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(float x) : this(ValueType.Float)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(double x) : this(ValueType.Double)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Type-specific constructor, for convenience.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="x">The value to be wrapped.</param>
public Value(string x) : this(ValueType.String)
{
if (!Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
}
/// <summary>Implicit conversion from managed value to native struct representation.
/// <para>Since EFL 1.23.</para>
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
public static implicit operator ValueNative(Value v)
{
return v.GetNative();
}
/// <summary>Implicit conversion from native struct representation to managed wrapper.
/// <para>Since EFL 1.23.</para>
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
public static implicit operator Value(ValueNative v)
{
return new Value(v);
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(byte x)
{
var v = new Eina.Value(ValueType.Byte);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator byte(Value v)
{
byte b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(sbyte x)
{
var v = new Eina.Value(ValueType.SByte);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator sbyte(Value v)
{
sbyte b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(short x)
{
var v = new Eina.Value(ValueType.Short);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator short(Value v)
{
short b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(ushort x)
{
var v = new Eina.Value(ValueType.UShort);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator ushort(Value v)
{
ushort b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(int x)
{
var v = new Eina.Value(ValueType.Int32);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator int(Value v)
{
int b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(uint x)
{
var v = new Eina.Value(ValueType.UInt32);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator uint(Value v)
{
uint b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(long x)
{
var v = new Eina.Value(ValueType.Long);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator long(Value v)
{
long b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(ulong x)
{
var v = new Eina.Value(ValueType.ULong);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator ulong(Value v)
{
ulong b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(float x)
{
var v = new Eina.Value(ValueType.Float);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator float(Value v)
{
float b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(double x)
{
var v = new Eina.Value(ValueType.Double);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator double(Value v)
{
double b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator Value(string x)
{
var v = new Eina.Value(ValueType.String);
if (!v.Set(x))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Implicit conversion.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static implicit operator string(Value v)
{
string b;
if (!v.Get(out b))
{
throw new InvalidOperationException("Couldn't get value.");
}
return b;
}
/// <summary>Unwrap the value into its underlying C# value.
///
/// <para>Useful for methods like <see crev="PropertyInfo.SetValue(object, object)" />
/// as it will unpack the value to it correct C# type.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>The managed value wrapped by this value.</returns>
public object Unwrap()
{
switch (GetValueType())
{
case ValueType.SByte:
{
sbyte o;
Get(out o);
return o;
}
case ValueType.Byte:
{
byte o;
Get(out o);
return o;
}
case ValueType.Short:
{
short o;
Get(out o);
return o;
}
case ValueType.UShort:
{
ushort o;
Get(out o);
return o;
}
case ValueType.Int32:
{
int o;
Get(out o);
return o;
}
case ValueType.UInt32:
{
uint o;
Get(out o);
return o;
}
case ValueType.Int64:
case ValueType.Long:
{
long o;
Get(out o);
return o;
}
case ValueType.UInt64:
case ValueType.ULong:
{
ulong o;
Get(out o);
return o;
}
case ValueType.Float:
{
float o;
Get(out o);
return o;
}
case ValueType.Double:
{
double o;
Get(out o);
return o;
}
case ValueType.String:
{
string o;
Get(out o);
return o;
}
case ValueType.Object:
{
Efl.Object o;
Get(out o);
return o;
}
case ValueType.Array:
case ValueType.List:
{
// Eina Array and Lists will be unwrapped into a System.Collections.Generic.List<T>
// usually to be handled as IEnumerable<T> through LINQ.
var genericType = ValueTypeBridge.GetStandard(GetValueSubType());
Type[] typeArgs = { genericType };
var containerType = typeof(System.Collections.Generic.List<>);
var retType = containerType.MakeGenericType(typeArgs);
object ret = Activator.CreateInstance(retType);
var addMeth = retType.GetMethod("Add");
if (addMeth == null)
{
throw new InvalidOperationException("Failed to get Add() method of container to wrap value");
}
for (int i = 0; i < Count(); i++)
{
object[] args = new object[]{ this[i] };
addMeth.Invoke(ret, args);
}
return ret;
}
default:
throw new InvalidOperationException($"Unsupported value type to unwrap: {GetValueType()}");
}
}
// Efl.Object conversions are made explicit to avoid ambiguity between
// Set(Efl.Object) and Set(Value) when dealing with classes derived from
// Efl.Object.
/// <summary>Explicit conversion from EFL objects.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static explicit operator Value(Efl.Object obj)
{
var v = new Eina.Value(ValueType.Object);
if (!v.Set(obj))
{
throw new InvalidOperationException("Couldn't set value.");
}
return v;
}
/// <summary>Explicit conversion from Value to Efl.Objects.
/// <para>Since EFL 1.23.</para>
/// </summary>
public static explicit operator Efl.Object(Value v)
{
Efl.Object obj;
if (!v.Get(out obj))
{
throw new InvalidOperationException("Couldn't get value.");
}
return obj;
}
/// <summary>Creates an Value instance from a given array description.
/// <para>Since EFL 1.23.</para>
/// </summary>
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
private static Value FromArrayDesc(Eina.EinaNative.Value_Array arrayDesc)
{
Value value = new Value();
value.Setup(ValueType.Array, ValueType.String); // Placeholder values to be overwritten by the following pset call.
eina_value_pset_wrapper(value.Handle, ref arrayDesc);
return value;
}
/// <summary>Creates an Value instance from a given array description.
/// <para>Since EFL 1.23.</para>
/// </summary>
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
private static Value FromListDesc(Eina.EinaNative.Value_List listDesc)
{
Value value = new Value();
value.Setup(ValueType.List, ValueType.String); // Placeholder values to be overwritten by the following pset call.
eina_value_pset_wrapper(value.Handle, ref listDesc);
return value;
}
/// <summary>Releases the ownership of the underlying value to C.
/// <para>Since EFL 1.23.</para>
/// </summary>
public void ReleaseOwnership()
{
this.Ownership = Ownership.Unmanaged;
}
/// <summary>Takes the ownership of the underlying value to the Managed runtime.
/// <para>Since EFL 1.23.</para>
/// </summary>
public void TakeOwnership()
{
this.Ownership = Ownership.Managed;
}
/// <summary>Public method to explicitly free the wrapped eina value.
/// <para>Since EFL 1.23.</para>
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>Actually free the wrapped eina value. Can be called from Dispose() or through the Garbage Collector.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="disposing"><c>true</c> if called from the method <see cref="Dispose()" />
/// <c>false</c> if called from the Garbage Collector.</param>
protected virtual void Dispose(bool disposing)
{
if (this.Ownership == Ownership.Unmanaged)
{
Disposed = true;
return;
}
if (!Disposed && (Handle != IntPtr.Zero))
{
// No need to call flush as eina_value_free already calls it for us.
efl-csharp: fix resource deallocation causing errors everywhere Summary: This commit mainly fixes errors caused by deallocating resources in the garbage collector thread. Using `ecore_main_loop_thread_safe_call_async` to queue resource deallocation in the main thread seems to solve it. Also, some `efl_ref` calls are added in places they were missing, mainly objects that unref in the destructor thus taking ownership if efl_ref is not called. Also fix improper resource deallocation in tests that were causing it to crash, enabling it to call Efl.All.Shutdown again. This allocation and the deallocation process was moved from the Eo class constructor to static class methods that are called in the test 'set up' and 'tear down' methods. Queuing resource deallocation in the main thread make it mandatory that tests call `Efl.App.AppMain.Iterate()` if they want to check proper resource deallocation (like TestFunctionPointers.set_callback_inherited_called_from_c). Extras: Remove duplicated declaration of 'eflcustomexportsmono' in meson in order to fix some linking problems. Remove some unused code around deallocation functions that had to be reworked. Object allocation is now supplied with the call site information it expects (file name and line for _efl_add_start). Depends on D8550 Test Plan: meson test Reviewers: felipealmeida, lauromoura, cedric, segfaultxavi Reviewed By: lauromoura Subscribers: segfaultxavi Tags: #efl_language_bindings, #do_not_merge Differential Revision: https://phab.enlightenment.org/D8431
2019-04-05 15:57:29 -07:00
if (disposing)
{
Free(this.Handle);
}
else
{
Efl.Eo.Globals.ThreadSafeFreeCbExec(eina_value_free, this.Handle);
efl-csharp: fix resource deallocation causing errors everywhere Summary: This commit mainly fixes errors caused by deallocating resources in the garbage collector thread. Using `ecore_main_loop_thread_safe_call_async` to queue resource deallocation in the main thread seems to solve it. Also, some `efl_ref` calls are added in places they were missing, mainly objects that unref in the destructor thus taking ownership if efl_ref is not called. Also fix improper resource deallocation in tests that were causing it to crash, enabling it to call Efl.All.Shutdown again. This allocation and the deallocation process was moved from the Eo class constructor to static class methods that are called in the test 'set up' and 'tear down' methods. Queuing resource deallocation in the main thread make it mandatory that tests call `Efl.App.AppMain.Iterate()` if they want to check proper resource deallocation (like TestFunctionPointers.set_callback_inherited_called_from_c). Extras: Remove duplicated declaration of 'eflcustomexportsmono' in meson in order to fix some linking problems. Remove some unused code around deallocation functions that had to be reworked. Object allocation is now supplied with the call site information it expects (file name and line for _efl_add_start). Depends on D8550 Test Plan: meson test Reviewers: felipealmeida, lauromoura, cedric, segfaultxavi Reviewed By: lauromoura Subscribers: segfaultxavi Tags: #efl_language_bindings, #do_not_merge Differential Revision: https://phab.enlightenment.org/D8431
2019-04-05 15:57:29 -07:00
}
}
Disposed = true;
}
/// <summary>Finalizer to be called from the Garbage Collector.
/// <para>Since EFL 1.23.</para>
/// </summary>
~Value()
{
Dispose(false);
}
/// <summary>Returns the native handle wrapped by this object.</summary>
/// <value>The native pointer wrapped by this object.</value>
public IntPtr NativeHandle
{
get
{
if (Disposed)
{
throw new ObjectDisposedException($"Value at 0x{this.Handle.ToInt64():x}");
}
return this.Handle;
}
}
/// <summary>Converts this storage to type 'type'.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns><c>true</c> if the configuration was successul.</returns>
public bool Setup(ValueType type)
{
if (Disposed)
{
throw new ObjectDisposedException($"Value at 0x{this.Handle.ToInt64():x}");
}
// Can't call setup with Empty value type (would give an eina error)
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
if (type == Eina.ValueType.Empty)
{
// Need to cleanup as it may point to payload outside the underlying Eina_Value (like arrays and strings).
if (!Empty)
{
eina_value_flush_wrapper(this.Handle);
}
MemoryNative.Memset(this.Handle, 0, eina_value_sizeof());
return true;
}
if (type.IsContainer())
{
throw new ArgumentException("To setup a container you must provide a subtype.");
}
return eina_value_setup_wrapper(this.Handle, ValueTypeBridge.GetNative(type));
}
/// <summary>Converts the storage type of this value to the container type <c>containerType</c>.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="containerType">The type of the container to store values.</param>
/// <param name="subtype">The type of the values contained.</param>
/// <param name="step">Amount to increase the capacity of the container by when it needs to grow.</param>
/// <returns><c>true</c> if the configuration was successul.</returns>
public bool Setup(ValueType containerType, ValueType subtype, uint step = 0)
{
IntPtr native_subtype = ValueTypeBridge.GetNative(subtype);
bool ret = false;
switch (containerType)
{
case ValueType.Array:
ret = eina_value_array_setup_wrapper(this.Handle, native_subtype, step);
break;
case ValueType.List:
ret = eina_value_list_setup_wrapper(this.Handle, native_subtype);
break;
}
return ret;
}
private void SanityChecks()
{
if (Disposed)
{
throw new ObjectDisposedException($"Value at 0x{this.Handle.ToInt64():x}");
}
}
private void ContainerSanityChecks(int targetIndex = -1)
{
SanityChecks();
uint size = 0;
ValueType type = GetValueType();
if (!type.IsContainer())
{
throw new InvalidValueTypeException("Value type must be a container");
}
if (targetIndex == -1) // Some methods (e.g. append) don't care about size
{
return;
}
switch (type)
{
case ValueType.Array:
size = eina_value_array_count_wrapper(this.Handle);
break;
case ValueType.List:
size = eina_value_list_count_wrapper(this.Handle);
break;
}
if (targetIndex >= size)
{
throw new System.ArgumentOutOfRangeException(
$"Index {targetIndex} is larger than max array index {size-1}");
}
}
private void OptionalSanityChecks()
{
SanityChecks();
ValueType type = GetValueType();
if (!type.IsOptional())
{
throw new InvalidValueTypeException("Value is not an Optional one");
}
}
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
/// <summary>Get a ValueNative struct with the *value* pointed by this Eina.Value.</summary>
[EditorBrowsable(EditorBrowsableState.Never)]
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
public ValueNative GetNative()
{
SanityChecks();
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
ValueNative value = (ValueNative)Marshal.PtrToStructure(this.Handle, typeof(ValueNative));
return value;
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(byte value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Byte),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_uchar(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(sbyte value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.SByte),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_char(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(short value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Short),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_short(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(ushort value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.UShort),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_ushort(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(uint value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.UInt32),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_uint(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(int value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Int32),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_int(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(ulong value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.ULong),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_ulong(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(long value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Long),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_long(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(float value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Float),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_float(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(double value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Double),
ref value);
}
if (!GetValueType().IsNumeric())
{
throw (new ArgumentException(
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
"Trying to set numeric value on a non-numeric Eina.Value"));
}
return eina_value_set_wrapper_double(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(string value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.String),
ref value);
}
if (!GetValueType().IsString())
{
throw (new ArgumentException(
"Trying to set string value on a non-string Eina.Value"));
}
// No need to worry about ownership as eina_value_set will copy the passed string.
return eina_value_set_wrapper_string(this.Handle, value);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
public bool Set(Eina.Error value)
{
SanityChecks();
int error_code = value;
if (this.Optional)
{
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Error),
ref error_code);
}
return eina_value_set_wrapper_int(this.Handle, error_code);
}
/// <summary>Sets the contained value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(Efl.Object value)
{
SanityChecks();
if (this.Optional)
{
IntPtr ptr = value.NativeHandle;
return eina_value_optional_pset(this.Handle,
ValueTypeBridge.GetNative(ValueType.Object),
ref ptr);
}
return eina_value_set_wrapper_ptr(this.Handle, value.NativeHandle);
}
/// <summary>Stores the given value into this value. This value's <see cref="Eina.Value.Optional" /> must
/// be <c>true</c>.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The value to be stored.</param>
/// <returns><c>true</c> if the value was successfully stored.</returns>
public bool Set(Value value)
{
OptionalSanityChecks();
ValueType subtype = value.GetValueType();
IntPtr ptr_val = MemoryNative.Alloc(subtype.MarshalSizeOf());
IntPtr native_type = ValueTypeBridge.GetNative(subtype);
try
{
switch (subtype)
{
// PSet on Container types require an Eina_Value_<Container>, which is the structure
// that contains subtype, etc.
case ValueType.Array:
EinaNative.Value_Array value_array;
if (!eina_value_get_wrapper(value.Handle, out value_array))
{
return false;
}
Marshal.StructureToPtr(value_array, ptr_val, false);
break;
case ValueType.List:
EinaNative.Value_List value_list;
if (!eina_value_get_wrapper(value.Handle, out value_list))
{
return false;
}
Marshal.StructureToPtr(value_list, ptr_val, false);
break;
default:
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
throw new InvalidValueTypeException("Only containers can be passed as raw Eina.Values");
}
return eina_value_optional_pset(this.Handle, native_type, ptr_val);
}
finally
{
MemoryNative.Free(ptr_val);
}
}
/// <summary>Gets the currently stored value as a byte.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out byte value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as a sbyte.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out sbyte value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as a short.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out short value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as an ushort.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out ushort value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as an int.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out int value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as an uint.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out uint value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as a long.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out long value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as an ulong.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out ulong value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as a float.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out float value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as a double.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out double value)
{
SanityChecks();
if (this.Optional)
{
return eina_value_optional_pget(this.Handle, out value);
}
else
{
return eina_value_get_wrapper(this.Handle, out value);
}
}
/// <summary>Gets the currently stored value as a string.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out string value)
{
SanityChecks();
IntPtr output = IntPtr.Zero;
if (this.Optional)
{
if (!eina_value_optional_pget(this.Handle, out output))
{
value = String.Empty;
return false;
}
}
else if (!eina_value_get_wrapper(this.Handle, out output))
{
value = String.Empty;
return false;
}
value = StringConversion.NativeUtf8ToManagedString(output);
return true;
}
/// <summary>Gets the currently stored value as an Eina.Error.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
public bool Get(out Eina.Error value)
{
SanityChecks();
bool ret;
int intermediate; // It seems out doesn't play well with implicit operators...
if (this.Optional)
{
ret = eina_value_optional_pget(this.Handle, out intermediate);
}
else
{
ret = eina_value_get_wrapper(this.Handle, out intermediate);
}
value = intermediate;
return ret;
}
/// <summary>Gets the currently stored value as an <see cref="Efl.Object"/>.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="obj">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out Efl.Object obj)
{
// FIXME Implement me
SanityChecks();
IntPtr ptr;
bool ret;
if (this.Optional)
{
ret = eina_value_optional_pget(this.Handle, out ptr);
}
else
{
ret = eina_value_get_wrapper(this.Handle, out ptr);
}
if (ret)
{
obj = (Efl.Object) Efl.Eo.Globals.CreateWrapperFor(ptr);
}
else
{
obj = null;
}
return ret;
}
/// <summary>Gets the currently stored value as a complex (e.g. container) <see cref="Eina.Value" />.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="value">The target variable to receive the value.</param>
/// <returns>True if the value was correctly retrieved.</returns>
public bool Get(out Value value)
{
SanityChecks();
value = null;
if (!this.Optional)
{
throw new InvalidValueTypeException("Values can only be retreived");
}
IntPtr nativeType = eina_value_optional_type_get_wrapper(this.Handle);
ValueType managedType = ValueTypeBridge.GetManaged(nativeType);
switch (managedType)
{
case ValueType.Array:
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
Eina.EinaNative.Value_Array array_desc;
if (!eina_value_optional_pget(this.Handle, out array_desc))
{
return false;
}
value = Value.FromArrayDesc(array_desc);
break;
case ValueType.List:
csharp: Change to new class API. Summary: As discussed in T7204: - Eo Interfaces/mixins -> C# Interfaces with concrete class implementations - Eo Regular/Abstracts -> Proper C# classes - Added some new generators and helper methods. - Refactored the class generator, splitting into helper methods Eo handles now are stored only in the "root" class in any given inheritance tree (generally, Efl.Object), and accessible to each child. Methods also are defined in a single place instead of repeatedly generated in everyfile, reducing the size of the generated .dll from 30MB to around 4.5MB. Mixins are generated as C# interfaces but any regular class it inherits from is lost, as we can't have interfaces inheriting from regular classes. This will be dealt with in a later commit. Summary of API Changes: - Merged Inherit/Concrete classes. (These suffixes disappear from regular classes). - Interface still have implementations with 'Concrete' suffix for when they are returned from methods. - Removed 'I' from interface names. - Removed interfaces for regular/abstract Eo classes. - Concrete classes for interfaces/mixins hold the event argument struct. - Removed '_' from classes, enums, structs, etc, as indicated in C# naming conventions. - Namespaces are now Camel.Cased. - Renamed IWrapper's raw_handle/raw_klass to NativeHandle/NativeClass Also renamed the test classes as after the namespace change, the test namespace Test can conflict with the helper Test namespace. (And use more meaningful names than Test.Testing...) Also Fixes T7336 by removing a deprecated example and adding efl_loop_timer_example to build system. Fixes T7451 by hiding the class_get DllImports and renaming the IWrapper fields. The native handlers are used in the manual binding. Still need to work: - As there are still some events names clashing (e.g. Efl.Ui.Bg with "resize" from Efl.Gfx.Entity and Efl.Gfx.Image), Events are currently declared on the interface and implemented "namespaced" in the classes, requiring the cast to the interface to access the event. - The Mixin Conundrum. Mixin inheritance will be dealt in a future commit. Depends on D7260 Reviewers: segfaultxavi, vitor.sousa, felipealmeida, Jaehyun_Cho Reviewed By: vitor.sousa Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7451, T7336 Differential Revision: https://phab.enlightenment.org/D7262
2018-11-29 15:04:37 -08:00
Eina.EinaNative.Value_List list_desc;
if (!eina_value_optional_pget(this.Handle, out list_desc))
{
return false;
}
value = Value.FromListDesc(list_desc);
break;
}
return true;
}
/// <summary>Gets the 'Type' this value is currently configured to store.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>The type of the value stored in this object.</returns>
public ValueType GetValueType()
{
if (Disposed)
{
throw new ObjectDisposedException(base.GetType().Name);
}
IntPtr native_type = eina_value_type_get_wrapper(this.Handle);
return ValueTypeBridge.GetManaged(native_type);
}
/// <summary>Stores in <c>destination</c> a value converted from this one.
///
/// <para>If the types of this value and <c>destination</c> differ, the library
/// searches this value's type for a conversion function to the type of <c>destination</c>.
/// If no such conversion is available, it searches the destination's type for a
/// function converting from the type of this value.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <example>
/// <code>
/// var value = new Eina.Value("3.14"); // Type is string
/// var dest = new Eina.Value(Eina.ValueType.Float); // Type is float
/// value.ConvertTo(dest);
/// // Dest now contains 3.14.
/// </code>
///
/// </example>
/// <param name="destination">The object to receive the converted value.</param>
/// <returns><c>true</c> if the value was successfully converted.</returns>
public bool ConvertTo(Value destination)
{
if (destination == null)
{
return false;
}
SanityChecks();
return eina_value_convert(this.Handle, destination.Handle);
}
/// <summary>Compare two eina values.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="other">The object to be compared to.</param>
/// <returns><c>-1</c>, <c>0</c> or <c>1</c> if this value is respectively smaller than, equal to or greater than
/// the <c>other</c>.</returns>
public int CompareTo(Value other)
{
if (other == null)
{
return 1;
}
SanityChecks();
other.SanityChecks();
return eina_value_compare_wrapper(this.Handle, other.Handle);
}
/// <summary>Compare to other values.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="other">The object to be compared to.</param>
/// <returns><c>-1</c>, <c>0</c> or <c>1</c> if this value is respectively smaller than, equal to or greater than
/// the <c>other</c>.</returns>
public int Compare(Value other)
{
return this.CompareTo(other);
}
/// <summary>Returns whether this value is equal to the given object.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="obj">The object to be compared to.</param>
/// <returns><c>true</c> if this value is equal to <c>other</c>.</returns>
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Value v = obj as Value;
if (v == null)
{
return false;
}
return this.Equals(v);
}
/// <summary>Returns whether this value is equal to the given value.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="other">The value to be compared to.</param>
/// <returns><c>true</c> if this value is equal to <c>other</c>.</returns>
public bool Equals(Value other)
{
try
{
return this.CompareTo(other) == 0;
}
catch (ObjectDisposedException)
{
return false;
}
}
/// <summary>Gets the hash code for this value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>The hash code of this value.</returns>
public override int GetHashCode()
{
return this.Handle.ToInt32();
}
/// <summary>Returns whether both values are null or <c>x</c> is equal to <c>y</c>.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns><c>true</c> if both parameters are <c>null</c> or if <c>x</c> is equal
/// to <c>y</c>.</returns>
public static bool operator==(Value x, Value y)
{
if (object.ReferenceEquals(x, null))
{
return object.ReferenceEquals(y, null);
}
return x.Equals(y);
}
/// <summary>Returns whether <c>x</c> is different from <c>y</c>.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns><c>true</c> if <c>x</c> is different from <c>y</c>.</returns>
public static bool operator!=(Value x, Value y)
{
if (object.ReferenceEquals(x, null))
{
return !object.ReferenceEquals(y, null);
}
return !x.Equals(y);
}
/// <summary>Returns whether <c>x</c> is greater than <c>y</c>.
///
/// <para>If either parameter is <c>null</c>, <c>false</c> is returned.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns><c>true</c> if <c>x</c> is greater than <c>y</c>.</returns>
public static bool operator>(Value x, Value y)
{
if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null))
{
return false;
}
return x.CompareTo(y) > 0;
}
/// <summary>Returns whether <c>x</c> is smaller than <c>y</c>.
///
/// <para>If either parameter is <c>null</c>, <c>false</c> is returned.</para>
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns><c>true</c> if <c>x</c> is smaller than <c>y</c>.</returns>
public static bool operator<(Value x, Value y)
{
if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null))
{
return false;
}
return x.CompareTo(y) < 0;
}
/// <summary>Converts value to string.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>A string representation of this value.</returns>
public override String ToString()
{
SanityChecks();
return eina_value_to_string(this.Handle);
}
/// <summary>Empties an optional Eina.Value, freeing what was previously contained.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns><c>true</c> if the operation was successful.</returns>
public bool Reset()
{
OptionalSanityChecks();
return eina_value_optional_reset(this.Handle);
}
// Container value methods
/// <summary>Gets the number of elements in this container value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>The number of elements.</returns>
public int Count()
{
ContainerSanityChecks();
switch (GetValueType())
{
case ValueType.Array:
return (int)eina_value_array_count_wrapper(this.Handle);
case ValueType.List:
return (int)eina_value_list_count_wrapper(this.Handle);
}
return -1;
}
/// <summary>Appends new values to this container.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="o">The new value to be appended.</param>
/// <returns><c>true</c> if the value was successfully appended.</returns>
public bool Append(object o)
{
ContainerSanityChecks();
switch (GetValueSubType())
{
case ValueType.SByte:
{
sbyte b = Convert.ToSByte(o);
return eina_value_container_append_wrapper_char(this.Handle, b);
}
case ValueType.Byte:
{
byte b = Convert.ToByte(o);
return eina_value_container_append_wrapper_uchar(this.Handle, b);
}
case ValueType.Short:
{
short b = Convert.ToInt16(o);
return eina_value_container_append_wrapper_short(this.Handle, b);
}
case ValueType.UShort:
{
ushort b = Convert.ToUInt16(o);
return eina_value_container_append_wrapper_ushort(this.Handle, b);
}
case ValueType.Int32:
{
int x = Convert.ToInt32(o);
return eina_value_container_append_wrapper_int(this.Handle, x);
}
case ValueType.UInt32:
{
uint x = Convert.ToUInt32(o);
return eina_value_container_append_wrapper_uint(this.Handle, x);
}
case ValueType.Long:
case ValueType.Int64:
{
long x = Convert.ToInt64(o);
return eina_value_container_append_wrapper_long(this.Handle, x);
}
case ValueType.ULong:
case ValueType.UInt64:
{
ulong x = Convert.ToUInt64(o);
return eina_value_container_append_wrapper_ulong(this.Handle, x);
}
case ValueType.Float:
{
float x = Convert.ToSingle(o);
return eina_value_container_append_wrapper_float(this.Handle, x);
}
case ValueType.Double:
{
double x = Convert.ToDouble(o);
return eina_value_container_append_wrapper_double(this.Handle, x);
}
case ValueType.String:
{
string x = Convert.ToString(o);
return eina_value_container_append_wrapper_string(this.Handle, x);
}
case ValueType.Object:
{
var x = (Efl.Object) o;
return eina_value_container_append_wrapper_ptr(this.Handle, x.NativeHandle);
}
}
return false;
}
/// <summary>Indexer for this container.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="i">The index of the element to be accessed/set.</param>
public object this[int i]
{
get
{
ContainerSanityChecks(i);
switch (GetValueSubType())
{
case ValueType.SByte:
{
sbyte ret = default(sbyte);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.Byte:
{
byte ret = default(byte);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.Short:
{
short ret = default(short);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.UShort:
{
ushort ret = default(ushort);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.Int32:
{
int ret = default(int);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.UInt32:
{
uint ret = default(uint);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.Long:
case ValueType.Int64:
{
long ret = default(long);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.ULong:
case ValueType.UInt64:
{
ulong ret = default(ulong);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.Float:
{
float ret = default(float);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.Double:
{
double ret = default(double);
eina_value_container_get_wrapper(this.Handle, i, out ret);
return ret;
}
case ValueType.String:
{
// Using intptr as using string as the arg type in the DllImport'd function would
// make mono take ownership of the string.
IntPtr ptr = IntPtr.Zero;
eina_value_container_get_wrapper(this.Handle, i, out ptr);
return Eina.StringConversion.NativeUtf8ToManagedString(ptr);
}
case ValueType.Object:
{
IntPtr ptr = IntPtr.Zero;
eina_value_container_get_wrapper(this.Handle, i, out ptr);
return Efl.Eo.Globals.CreateWrapperFor(ptr);
}
default:
throw new InvalidOperationException("Subtype not supported.");
}
}
set
{
ContainerSanityChecks(i);
switch (GetValueSubType())
{
case ValueType.SByte:
{
sbyte v = Convert.ToSByte(value);
eina_value_container_set_wrapper_char(this.Handle, i, v);
break;
}
case ValueType.Byte:
{
byte v = Convert.ToByte(value);
eina_value_container_set_wrapper_uchar(this.Handle, i, v);
break;
}
case ValueType.Short:
{
short x = Convert.ToInt16(value);
eina_value_container_set_wrapper_short(this.Handle, i, x);
break;
}
case ValueType.UShort:
{
ushort x = Convert.ToUInt16(value);
eina_value_container_set_wrapper_ushort(this.Handle, i, x);
break;
}
case ValueType.Int32:
{
int x = Convert.ToInt32(value);
eina_value_container_set_wrapper_int(this.Handle, i, x);
break;
}
case ValueType.UInt32:
{
uint x = Convert.ToUInt32(value);
eina_value_container_set_wrapper_uint(this.Handle, i, x);
break;
}
case ValueType.Long:
case ValueType.Int64:
{
long x = Convert.ToInt64(value);
eina_value_container_set_wrapper_long(this.Handle, i, x);
break;
}
case ValueType.ULong:
case ValueType.UInt64:
{
ulong x = Convert.ToUInt64(value);
eina_value_container_set_wrapper_ulong(this.Handle, i, x);
break;
}
case ValueType.Float:
{
float x = Convert.ToSingle(value);
eina_value_container_set_wrapper_float(this.Handle, i, x);
break;
}
case ValueType.Double:
{
double x = Convert.ToDouble(value);
eina_value_container_set_wrapper_double(this.Handle, i, x);
break;
}
case ValueType.String:
{
string x = Convert.ToString(value);
eina_value_container_set_wrapper_string(this.Handle, i, x);
break;
}
case ValueType.Object:
{
Efl.Object x = (Efl.Object)value;
eina_value_container_set_wrapper_ptr(this.Handle, i, x.NativeHandle);
break;
}
}
}
}
/// <summary>Gets the type of the values in this container value.
///
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <returns>The <see cref="Eina.ValueType" /> of the values contained in this container.</returns>
public ValueType GetValueSubType()
{
ContainerSanityChecks();
IntPtr native_subtype = IntPtr.Zero;
switch (GetValueType())
{
case ValueType.Array:
native_subtype = eina_value_array_subtype_get_wrapper(this.Handle);
break;
case ValueType.List:
native_subtype = eina_value_list_subtype_get_wrapper(this.Handle);
break;
}
return ValueTypeBridge.GetManaged(native_subtype);
}
}
/// <summary> Custom marshaler to convert value pointers to managed values and back,
/// without changing ownership.</summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class ValueMarshaler : ICustomMarshaler
{
/// <summary>Creates a managed value from a C pointer, whitout taking ownership of it.</summary>
public object MarshalNativeToManaged(IntPtr pNativeData)
{
return new Value(pNativeData, Ownership.Unmanaged);
}
/// <summary>Retrieves the C pointer from a given managed value,
/// keeping the managed ownership.</summary>
public IntPtr MarshalManagedToNative(object managedObj)
{
try
{
Value v = (Value)managedObj;
return v.Handle;
}
catch (InvalidCastException)
{
return IntPtr.Zero;
}
}
public void CleanUpNativeData(IntPtr pNativeData)
{
}
public void CleanUpManagedData(object managedObj)
{
}
public int GetNativeDataSize()
{
return -1;
}
public static ICustomMarshaler GetInstance(string cookie)
{
if (marshaler == null)
{
marshaler = new ValueMarshaler();
}
return marshaler;
}
static private ValueMarshaler marshaler;
}
/// <summary> Custom marshaler to convert value pointers to managed values and back,
/// also transferring the ownership to the other side.</summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class ValueMarshalerOwn : ICustomMarshaler
{
/// <summary>Creates a managed value from a C pointer, taking the ownership.</summary>
public object MarshalNativeToManaged(IntPtr pNativeData)
{
return new Value(pNativeData, Ownership.Managed);
}
/// <summary>Retrieves the C pointer from a given managed value,
/// transferring the ownership to the unmanaged side, which should release it
/// when not needed. </summary>
public IntPtr MarshalManagedToNative(object managedObj)
{
try
{
Value v = (Value)managedObj;
v.ReleaseOwnership();
return v.Handle;
}
catch (InvalidCastException)
{
return IntPtr.Zero;
}
}
public void CleanUpNativeData(IntPtr pNativeData)
{
}
public void CleanUpManagedData(object managedObj)
{
}
public int GetNativeDataSize()
{
return -1;
}
public static ICustomMarshaler GetInstance(string cookie)
{
if (marshaler == null)
{
marshaler = new ValueMarshalerOwn();
}
return marshaler;
}
static private ValueMarshalerOwn marshaler;
}
/// <summary> Custom marshaler to convert value type pointers to managed boxed enum values
/// and back.</summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class ValueTypeMarshaler : ICustomMarshaler
{
/// <summary>Creates a boxed ValueType enum value from a C pointer.</summary>
public object MarshalNativeToManaged(IntPtr pNativeData)
{
var r = ValueTypeBridge.GetManaged(pNativeData);
return new ValueTypeBox(r);
}
public static readonly Eina.ValueType vtype;
/// <summary>Retrieves the C pointer from a given boxed enum value type.</summary>
public IntPtr MarshalManagedToNative(object managedObj)
{
ValueTypeBox v = (ValueTypeBox)managedObj;
return ValueTypeBridge.GetNative(v);
}
public void CleanUpNativeData(IntPtr pNativeData)
{
}
public void CleanUpManagedData(object managedObj)
{
}
public int GetNativeDataSize()
{
return -1;
}
public static ICustomMarshaler GetInstance(string cookie)
{
if (marshaler == null)
{
marshaler = new ValueTypeMarshaler();
}
return marshaler;
}
static private ValueTypeMarshaler marshaler;
}
}