#include<array>
#include<vector>
#include<string>
#include<iostream>
#include<cstring>
template<size_t N, typename T = char>
class static_string {
std::array<T, N> static_array;
public:
template<size_t M>
static_string(std::array<T, M> const& str) {
enum { size = (N < M)?N:M };
memcpy(static_array.data(), str.data(), size*sizeof(T));
if(size < N) static_array[size] = 0;
}
template<size_t M>
static_string(const T (&str)[M]) {
enum { size = (N < M)?N:M };
memcpy(static_array.data(), str, size*sizeof(T));
if(size < N) static_array[size] = 0;
}
static_string(std::basic_string<T> const& str) {
const size_t size = (N < str.size())?N:str.size();
memcpy(static_array.data(), str.data(), size*sizeof(T));
if(size < N) static_array[size] = 0;
}
template<size_t M>
static_string& operator=(std::array<T, M> const& str) {
static_string temp(str);
static_array.swap(temp.static_array);
return *this;
}
template<size_t M>
static_string& operator=(const T (&str)[M]) {
static_string temp(str);
static_array.swap(temp.static_array);
return *this;
}
static_string& operator=(std::basic_string<T> const& str) {
static_string temp(str);
static_array.swap(temp.static_array);
return *this;
}
operator std::basic_string<T>() const {
std::basic_string<T> temp;
for(size_t i = 0; i < N && static_array[i] > 0; ++i)
temp.push_back(static_array[i]);
return temp;
}
const T* data() const noexcept { return static_array.data(); }
bool operator<(static_string const& str) const { return static_array < str.static_array; }
bool operator==(static_string const& str) const {
return !strcmp(static_array.data(), str.static_array.data());
}
};
template<size_t N, typename T>
std::ostream& operator<< (std::ostream& os, static_string<N, T> const& str) {
return (os << std::string(str));
}
int main() {
char p1[] = "abcd";
static_string<20> str1 = p1;
static_string<20> str2 = "qwerty";
static_string<20> str3 = std::string("zxcvb");
static_string<20> str4 = static_string<20>("abcd");
str1 = p1;
str2 = "qwerty";
str3 = std::string("zxcvb");
str4 = static_string<20>("abcd");
str3 = str2;
std::string str = str1;
str1 = str;
std::cout << str << std::endl << std::endl;
std::vector<static_string<20>> vec_str = {str1, str2, str3, str4};
std::cout << std::boolalpha;
for(const auto &i : vec_str) {
for(const auto &k : vec_str) {
std::cout << "(" << i << " == " << k << ") = " << (i == k) << std::endl;
}
}
std::cout << std::endl << str1 << "," << str2 << "," << str3 << "," << str4 << "," << std::endl;
static_string<20, wchar_t> str5 = std::wstring(L"zxcvb");
std::wstring wstr = str5;
str5 = wstr;
return 0;
}