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);
116 #define CATCH_AND_FORWARD \ 117 catch (std::exception&) {throw;} \ 118 catch (_com_error& e) {throw std::runtime_error(string("COM error: ") + e.ErrorMessage());} \ 120 catch (System::Exception^ e) \ 122 std::vector<boost::iterator_range<std::string::const_iterator> > tokens; \ 123 std::string function(__FUNCTION__); \ 124 boost::algorithm::split(tokens, function, boost::is_any_of(":"), boost::algorithm::token_compress_on); \ 125 std::string what("["); \ 126 if (tokens.size() > 1) \ 128 boost::range::copy(*(tokens.rbegin()+1), std::back_inserter(what)); \ 130 if (boost::range::equal(*(tokens.rbegin()+1), *tokens.rbegin())) \ 132 else if (tokens.rbegin()->front() == '~') \ 135 boost::range::copy(*tokens.rbegin(), std::back_inserter(what)); \ 137 else if (tokens.size() > 0) \ 138 boost::range::copy(*tokens.rbegin(), std::back_inserter(what)); \ 140 what += pwiz::util::ToStdString(e->Message); \ 141 throw std::runtime_error(what); \ 145 #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 ...
void ToStdVector(cli::array< managed_value_type >^ managedArray, std::vector< native_value_type > &stdVector)
System::String ToSystemString(const std::string &source, bool utf8=true)