Type conversion can be the most googled material in daily programming regardless of the kind of language. That is also the case when writing C++ code. For example, I often forget how to convert the std::string to char * and vice versa. llvm::StringRef brings additional complexity definitely into this conversion graph between string compatible types in C++.
This article is a brief note on how to move back and forward among these three data types so that we can later refer to them as necessary.
std::string -> char *
It’s pretty simple. std::string has a method to return the pointer to the underlying character entities. c_str() allows us to do so.
std::string str = "Hello, World";
const char *c = str.c_str();
char * -> std::string
std::string has a constructor that takes the const char* type. Thus, it enables you to create std::string from the char * type.
const char *c = "Hello, World";
std::string str(c);
llvm::StringRef -> std::string
llvm::StringRef has a method to return the string entity, str().
llvm::StringRef stringRef("Hello, World");
std::string str = stringRef.str();
llvm::StringRef -> char *
llvm::StringRef has a method to return the underlying data pointer. data() method will do that.
llvm::StringRef stringRef("Hello, World");
const char *c = stringRef.data();
llvm::StringRef stringRef("Hello, World");
std::string str = stringRef.str();
std::string, char * -> llvm::StringRef
We can construct llvm::StringRef from both types of std::string and char * by its constructor.
std::string str = "Hello, String";
const char *c = "Hello, Char";
llvm::StringRef stringRef1(str);
llvm::StringRef stringRef2(c);