LoginSignup
1
0

【自分用】SuperUUIDというclassを作っただけ

Posted at

ソースコード

SuperUUID.hpp
#pragma once
#include <random>
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>

class SuperUUID {
public:

	SuperUUID(size_t x4ByteNum = 4) {
		Create(x4ByteNum);
	}
	SuperUUID(const std::string& str) {
		StringTo(str);
	}
	~SuperUUID() {
		delete[] Data;
	}
	
	void Create(size_t x4ByteNum) {
        ByteNum4x = x4ByteNum;
		Data = new uint32_t[ByteNum4x];
		std::random_device rand;
		for (size_t i = 0; i < ByteNum4x; ++i) {
			Data[i] = rand();
		}
	}

	SuperUUID& operator =(const SuperUUID& r) {
		this->ByteNum4x = r.ByteNum4x;
		delete[] this->Data;
		this->Data = new uint32_t[this->ByteNum4x];
		std::copy(r.Data, r.Data + r.ByteNum4x, this->Data);
		return *this;
	}
	SuperUUID& operator =(const std::string& r) {
		SuperUUID ret(r);
		return ret;
	}

	bool operator ==(const SuperUUID& r) const {
		if (this->ByteNum4x != r.ByteNum4x) {
			return false;
		}
		for (size_t i = 0; i < ByteNum4x; ++i) {
			if (this->Data[i] != r.Data[i]) {
				return false;
			}
		}
		return true;
	}
	bool operator !=(const SuperUUID& r) const {
		return !((*this) == r);
	}

	std::string ToString() {
		std::string ret;
		std::ostringstream ss;
		for (size_t i = 0; i < ByteNum4x; ++i) {
			ss << std::setfill('0') << std::setw(8) << std::setbase(16) << Data[i];
			ret += ss.str();
			ss.str("");
		}
		return ret;
	}
	void StringTo(const std::string& str) {
		size_t size = (str.size() / 8) + (str.size() % 8 == 0 ? 0 : 1);
		delete[] Data;
		Data = new uint32_t[size];
		ByteNum4x = size;
		std::string tData;
		for (size_t i = 0; i < ByteNum4x; ++i) {
			tData = "0x";
			tData += str.substr(i * 8, 8);
			Data[i] = std::stoul(tData, nullptr, 16);
		}
	}
	
private:

	size_t ByteNum4x;
	uint32_t* Data;
};

出力例

image.png

使い方

コンストラクタで長さを決めます
x4ByteNum*8文字分になります
長さを決めたらあとは自動で作られます
動的なものはデストラクタでちゃんと廃棄されるので安心してください

std::stringからSuperUUIDの変換、SuperUUIDからstd::stringの変換ができます
std::stringからSuperUUIDへ変換する場合16進数表記である必要があります

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0