23 #ifndef _CPP_CLI_UTILITIES_HPP_ 24 #define _CPP_CLI_UTILITIES_HPP_ 32 #include <boost/algorithm/string/split.hpp> 33 #include <boost/range/algorithm/copy.hpp> 34 #include "automation_vector.h" 42 if (System::String::IsNullOrEmpty(source))
45 System::Text::Encoding^ encoding = System::Text::Encoding::UTF8;
46 array<System::Byte>^ encodedBytes = encoding->GetBytes(source);
48 std::string target(
"", encodedBytes->Length);
49 char* buffer = &target[0];
50 unsigned char* unsignedBuffer =
reinterpret_cast<unsigned char*
>(buffer);
51 System::Runtime::InteropServices::Marshal::Copy(encodedBytes, 0, (System::IntPtr) unsignedBuffer, encodedBytes->Length);
56 inline System::String^
ToSystemString(
const std::string& source,
bool utf8=
true)
60 System::Text::Encoding^ encoding = System::Text::Encoding::UTF8;
61 int length = source.length();
62 array<System::Byte>^ buffer =
gcnew array<System::Byte>(length);
63 System::Runtime::InteropServices::Marshal::Copy((System::IntPtr) const_cast<char*>(source.c_str()), buffer, 0, length);
64 return encoding->GetString(buffer);
67 return gcnew System::String(source.c_str());
71 template<
typename managed_value_type,
typename native_value_type>
72 void ToStdVector(cli::array<managed_value_type>^ managedArray, std::vector<native_value_type>& stdVector)
75 if (managedArray->Length > 0)
77 cli::pin_ptr<managed_value_type> pin = &managedArray[0];
78 native_value_type* begin = (native_value_type*) pin;
79 stdVector.assign(begin, begin + managedArray->Length);
84 template<
typename managed_value_type,
typename native_value_type>
85 void ToStdVector(System::Collections::Generic::IList<managed_value_type>^ managedList, std::vector<native_value_type>& stdVector)
88 if (managedList->Count > 0)
90 stdVector.reserve(managedList->Count);
91 for (
size_t i = 0, end = managedList->Count; i < end; ++i)
92 stdVector.push_back((native_value_type) managedList[i]);
98 template<
typename managed_value_type,
typename native_value_type>
99 void ToAutomationVector(cli::array<managed_value_type>^ managedArray, automation_vector<native_value_type>& automationArray)
103 System::IntPtr vPtr = (System::IntPtr) &v;
104 System::Runtime::InteropServices::Marshal::GetNativeVariantForObject((System::Object^) managedArray, vPtr);
105 automationArray.attach(v);
117 template <
typename T>
118 std::string trimFunctionMacro(
const char*
function,
const T& param)
120 std::vector<boost::iterator_range<std::string::const_iterator> > tokens;
121 std::string functionStr(
function);
122 boost::algorithm::split(tokens, functionStr, boost::is_any_of(
":"), boost::algorithm::token_compress_on);
123 std::string what(
"[");
124 if (tokens.size() > 1)
126 boost::range::copy(*(tokens.rbegin() + 1), std::back_inserter(what));
128 if (boost::range::equal(*(tokens.rbegin() + 1), *tokens.rbegin()))
130 else if (tokens.rbegin()->front() ==
'~')
133 boost::range::copy(*tokens.rbegin(), std::back_inserter(what));
135 else if (tokens.size() > 0)
136 boost::range::copy(*tokens.rbegin(), std::back_inserter(what));
147 #define CATCH_AND_FORWARD_EX(param) \ 148 catch (std::exception&) {throw;} \ 149 catch (_com_error& e) {throw std::runtime_error(string("COM error: ") + e.ErrorMessage());} \ 151 catch (System::AggregateException^ e) { throw std::runtime_error(trimFunctionMacro(__FUNCTION__, (param)) + pwiz::util::ToStdString(e->ToString())); } \ 152 catch (System::Exception^ e) { throw std::runtime_error(trimFunctionMacro(__FUNCTION__, (param)) + pwiz::util::ToStdString(e->Message)); } 154 #define CATCH_AND_FORWARD CATCH_AND_FORWARD_EX("") 156 #endif // _CPP_CLI_UTILITIES_HPP_
std::string ToStdString(System::String^ source)
void ToAutomationVector(cli::array< managed_value_type >^ managedArray, automation_vector< native_value_type > &automationArray)
wraps a managed array in an automation_vector to enable direct access from unmanaged code ...
float lexical_cast(const std::string &str)
void ToStdVector(cli::array< managed_value_type >^ managedArray, std::vector< native_value_type > &stdVector)
System::String ToSystemString(const std::string &source, bool utf8=true)