/*
 *  Copyright 2015 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#import "NSString+StdString.h"

#include "absl/strings/string_view.h"

@implementation NSString (StdString)

- (std::string)stdString {
  return [NSString stdStringForString:self];
}

+ (std::string)stdStringForString:(NSString *)nsString {
  NSData *charData = [nsString dataUsingEncoding:NSUTF8StringEncoding];
  return std::string(reinterpret_cast<const char *>(charData.bytes),
                     charData.length);
}

+ (NSString *)stringForStdString:(const std::string&)stdString {
  // std::string may contain null termination character so we construct
  // using length.
  return [[NSString alloc] initWithBytes:stdString.data()
                                  length:stdString.length()
                                encoding:NSUTF8StringEncoding];
}

@end

@implementation NSString (AbslStringView)

+ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView {
  return [[NSString alloc] initWithBytes:abslStringView.data()
                                  length:abslStringView.length()
                                encoding:NSUTF8StringEncoding];
}

@end
