CVB++ 15.0
Loading...
Searching...
No Matches
detail_object.hpp
1#pragma once
2
3#include "../_decl/decl_context.hpp"
4#include "../_decl/decl_object.hpp"
5
6
7
8namespace Cvb
9{
10 CVB_BEGIN_INLINE_NS
11
12 namespace PyScript
13 {
14 inline ObjectPtr Object::MakeVoidTuple(size_t size)
15 {
16 return Internal::DoResCallShareOut<Object>([size](void *&handle) {
17 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), CExports::CVPYSOTY_Tuple, nullptr, size, handle);
18 });
19 }
20
21 inline ObjectPtr Object::MakeVoidList(size_t size)
22 {
23 return Internal::DoResCallShareOut<Object>([size](void *&handle) {
24 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), CExports::CVPYSOTY_List, nullptr, size, handle);
25 });
26 }
27
28 template <class T>
29 inline ObjectPtr Object::CreateImpl(const T &value, PodTag)
30 {
31 return Internal::DoResCallShareOut<Object>([&value](void *&handle) {
32 auto storage = static_cast<typename Private::IsPod<T>::StorageType>(value);
33 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), Private::IsPod<T>::TypeId, &storage, Private::IsPod<T>::Size, handle);
34 });
35 }
36
37 template <class T>
38 inline ObjectPtr Object::CreateImpl(const T &value, HandleTag)
39 {
40 return Internal::DoResCallShareOut<Object>([&value](void *&handle) {
41 auto h = value.Handle();
42 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), Private::IsHandleType<T>::TypeId, &h, sizeof(void *),
43 handle);
44 });
45 }
46
47 template <class T>
48 inline ObjectPtr Object::CreateImpl(const T &value, EnumTag)
49 {
50 // use int64_t as some CVB enums use more than 32 bit!
51 return Create(static_cast<int64_t>(value));
52 }
53
54 template <class T>
55 inline ObjectPtr Object::CreateImpl(const T &value, CvbTag)
56 {
57 return Internal::DoResCallShareOut<Object>([&value](void *&handle) {
58 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), Private::IsCvbType<T>::TypeId, &value, sizeof(T), handle);
59 });
60 }
61
62 template <>
63 inline ObjectPtr Object::Create<std::string>(const std::string &value)
64 {
65 return Internal::DoResCallShareOut<Object>([&value](void *&handle) {
66 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), CExports::CVPYSOTY_String, value.c_str(),
67 value.size() + 1,
68 handle);
69 });
70 }
71
72 inline ObjectPtr Object::Create(const char *value)
73 {
74 return Create(std::string(value));
75 }
76
77 template <>
78 inline std::string Object::As<std::string>() const
79 {
80 CExports::CVPYSObjType type = CExports::CVPYSOTY_String;
81 size_t size = 0;
82 CVB_CALL_CAPI_CHECKED(CVPYSObjToBuffer(Handle(), type, nullptr, size));
83 std::vector<char> buffer(size);
84 CVB_CALL_CAPI_CHECKED(CVPYSObjToBuffer(Handle(), type, buffer.data(), size));
85 return std::string(buffer.data());
86 }
87
88 template <>
89 inline ObjectPtr Object::Create<std::wstring>(const std::wstring &value)
90 {
91 return Internal::DoResCallShareOut<Object>([&value](void *&handle) {
92 return CVPYSCreateObj(Context::CreateOrGet()->Handle(), CExports::CVPYSOTY_WString, value.c_str(),
93 (value.size() + 1) * sizeof(wchar_t), handle);
94 });
95 }
96
97 inline ObjectPtr Object::Create(const wchar_t *value)
98 {
99 return Create(std::wstring(value));
100 }
101
102 template <>
103 inline std::wstring Object::As<std::wstring>() const
104 {
105 CExports::CVPYSObjType type = CExports::CVPYSOTY_WString;
106 size_t size = 0;
107 CVB_CALL_CAPI_CHECKED(CVPYSObjToBuffer(Handle(), type, nullptr, size));
108 std::vector<wchar_t> buffer(size / sizeof(wchar_t));
109 CVB_CALL_CAPI_CHECKED(CVPYSObjToBuffer(Handle(), type, buffer.data(), size));
110 return std::wstring(buffer.data());
111 }
112 }
113
114 CVB_END_INLINE_NS
115} // namespace Cvb
static ContextPtr CreateOrGet()
Creates a context.
Definition decl_context.hpp:50
static std::shared_ptr< Object > MakeVoidList(size_t size)
Creates list with a specified size.
Definition detail_object.hpp:21
static std::shared_ptr< Object > Create(const T &value)
Creates a object form any supported type.
Definition decl_object.hpp:642
T As() const
Get an type from this object.
Definition decl_object.hpp:801
void * Handle() const noexcept
Classic API buffer handle.
Definition decl_object.hpp:812
static ObjectPtr MakeVoidTuple(size_t size)
Creates tuple with a specified size.
Definition detail_object.hpp:14
Namespace for the python scripting package.
Definition decl_context.hpp:21
std::shared_ptr< Object > ObjectPtr
Convenience shared pointer for Object.
Definition py_script.hpp:127
Root namespace for the Image Manager interface.
Definition version.hpp:11