/* * 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. */ /// /// @file eo_concrete.hh /// #ifndef EFL_CXX_EINA_COPY_TRAITS_HH #define EFL_CXX_EINA_COPY_TRAITS_HH namespace efl { namespace eina { namespace _impl { template struct bool_pack; template struct and_ : std::is_same, bool_pack> {}; } template struct variant; template struct copy_from_c_traits; template struct copy_from_c_traits::value>::type> { static void copy_to_unitialized(T* storage, void const* data) { std::memcpy(storage, data, sizeof(T)); } }; template struct copy_from_c_traits, typename std::enable_if<_impl::and_::value...>::value>::type> { template static void copy_to_unitialized(eina::variant* storage, T const* data) { new (storage) eina::variant{*data}; } }; template struct alloc_to_c_traits; template struct alloc_to_c_traits::value>::type> { typedef T c_type; static c_type* copy_alloc(T const& value) { c_type* v = static_cast(malloc(sizeof(c_type))); std::memcpy(v, &value, sizeof(c_type)); return v; } static void free_alloc(void* data) { ::free(data); } }; } } #endif