// Copyright 2017 Google Inc. All Rights Reserved.
//
// 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.

#ifndef STARBOARD_SHARED_UWP_WINRT_WORKAROUND_H_
#define STARBOARD_SHARED_UWP_WINRT_WORKAROUND_H_

namespace __winRT {
// TODO: without this, we get the following error at CoreApplication::Run:
// 'long __winRT::__getActivationFactoryByPCWSTR(i
//  void *,Platform::Guid &,void **)':
//  cannot convert argument 1 from 'const wchar_t [46]' to 'void *'
inline long __getActivationFactoryByPCWSTR(const wchar_t* a,
                                           Platform::Guid& b,
                                           void** c) {
  return __getActivationFactoryByPCWSTR(
      static_cast<void*>(const_cast<wchar_t*>(a)), b, c);
}
}  // namespace __winRT

#endif  // STARBOARD_SHARED_UWP_WINRT_WORKAROUND_H_
