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>
43 if (System::String::IsNullOrEmpty(source))
46 int len = (( source->Length+1) * 2);
47 char *ch =
new char[ len ];
50 pin_ptr<const wchar_t> wch = PtrToStringChars( source );
51 result = wcstombs( ch, wch, len ) != -1;
53 std::string target = ch;
56 throw gcnew System::Exception(
"error converting System::String to std::string");
63 return gcnew System::String(source.c_str());
67 template<
typename managed_value_type,
typename native_value_type>
68 void ToStdVector(cli::array<managed_value_type>^ managedArray, std::vector<native_value_type>& stdVector)
71 if (managedArray->Length > 0)
73 cli::pin_ptr<managed_value_type> pin = &managedArray[0];
74 native_value_type* begin = (native_value_type*) pin;
75 stdVector.assign(begin, begin + managedArray->Length);
81 template<
typename managed_value_type,
typename native_value_type>
82 void ToAutomationVector(cli::array<managed_value_type>^ managedArray, automation_vector<native_value_type>& automationArray)
86 System::IntPtr vPtr = (System::IntPtr) &v;
87 System::Runtime::InteropServices::Marshal::GetNativeVariantForObject((System::Object^) managedArray, vPtr);
88 automationArray.attach(v);
99 #define CATCH_AND_FORWARD \
100 catch (std::exception&) {throw;} \
101 catch (System::Exception^ e) \
103 std::vector<boost::iterator_range<std::string::const_iterator> > tokens; \
104 std::string function(__FUNCTION__); \
105 boost::algorithm::split(tokens, function, boost::is_any_of(":"), boost::algorithm::token_compress_on); \
106 std::string what("["); \
107 if (tokens.size() > 1) \
109 boost::range::copy(*(tokens.rbegin()+1), std::back_inserter(what)); \
111 if (boost::range::equal(*(tokens.rbegin()+1), *tokens.rbegin())) \
113 else if (tokens.rbegin()->front() == '~') \
116 boost::range::copy(*tokens.rbegin(), std::back_inserter(what)); \
118 else if (tokens.size() > 0) \
119 boost::range::copy(*tokens.rbegin(), std::back_inserter(what)); \
121 what += pwiz::util::ToStdString(e->Message); \
122 throw std::runtime_error(what); \
126 #endif // _CPP_CLI_UTILITIES_HPP_