講義目次¶
さまざまなアプリケーションの開発に利用できる関数やクラスについて、C++ 標準ライブラリに含まれないものを中心に、独自のライブラリコレクションを設計・実装する。
リポジトリ¶
1. 基本ライブラリ¶
- 全員が制作するライブラリ。
- 受講日までに本サイト上で実装ガイドと実装例が完成するので、それを参考にしながら自分でも実装しよう。
ライブラリ名 | 概要 |
---|---|
Common | 各ライブラリで共通してインクルードされるヘッダ |
Utility | 便利な関数やクラス |
Point | 2 次元座標(整数)を表すクラス |
FileSystem | ファイルシステム関連 |
Timer | 経過時間の計測 |
BinaryFileWriter | バイナリファイルを書き込むクラス |
BinaryFileReader | バイナリファイルを読み込むクラス |
TextFileWriter | テキストファイルを書き込むクラス |
TextFileReader | テキストファイルを読み込むクラス |
Color | 色を表すクラス |
Image | 画像を表すクラス |
BMP | BMP ファイルを読み書きする関数 |
2. 発展ライブラリ(選択課題)¶
- 基本ライブラリを利用して、さらに高度な機能を提供するライブラリ。
- 実装ガイドも参考にしながら自分で実装しよう。
- これ以外に、自分で考えたライブラリを制作してもよい。
ライブラリ名 | 概要 | 難易度 |
---|---|---|
Rect | 長方形(整数座標)を表すクラス | ★ |
Vector2D | 2 次元ベクトル(浮動小数点数)を表すクラス | ★★ |
Unicode | Unicode 文字列を扱う関数 | ★ |
INIFile | INI ファイルを読み書きするクラス | ★★★ |
PNG | PNG ファイルを読み書きする関数 | ★★ |
Paint | 画像に図形等を描画する関数 | ★ |
Wave | 音声波形を扱うクラス | ★★★ |
WAV | WAV ファイルを読み書きする関数 | ★★★ |
Synthesizer | 音声合成を行う関数 | ★★ |
3. 完成例¶
プロジェクト構成例
project/
├── Main.cpp
└── MyLib/
├── Common.hpp
├── Utility.hpp
├── Utility.cpp
├── Point.hpp
├── FileSystem.hpp
├── FileSystem.cpp
├── ...
...
Main.cpp
#include <print>
#include "MyLib/Common.hpp"
#include "MyLib/Utility.hpp"
#include "MyLib/Point.hpp"
#include "MyLib/FileSystem.hpp"
#include "MyLib/Timer.hpp"
#include "MyLib/BinaryFileWriter.hpp"
#include "MyLib/BinaryFileReader.hpp"
#include "MyLib/TextFileWriter.hpp"
#include "MyLib/TextFileReader.hpp"
#include "MyLib/Color.hpp"
#include "MyLib/Image.hpp"
#include "MyLib/BMP.hpp"
using namespace seccamp;
int main()
{
std::println("---- Common.hpp ----");
{
std::println("Hello, seccamp!");
std::println("SECCAMPLIB_VERSION_MAJOR: {}", SECCAMPLIB_VERSION_MAJOR);
std::println("SECCAMPLIB_VERSION_MINOR: {}", SECCAMPLIB_VERSION_MINOR);
std::println("SECCAMPLIB_VERSION_REVISION: {}", SECCAMPLIB_VERSION_REVISION);
std::println("SECCAMPLIB_VERSION_NUMBER: {}", SECCAMPLIB_VERSION_NUMBER);
std::println("sizeof(int8): {}", sizeof(int8));
std::println("sizeof(int16): {}", sizeof(int16));
std::println("sizeof(int32): {}", sizeof(int32));
std::println("sizeof(int64): {}", sizeof(int64));
std::println("sizeof(uint8): {}", sizeof(uint8));
std::println("sizeof(uint16): {}", sizeof(uint16));
std::println("sizeof(uint32): {}", sizeof(uint32));
std::println("sizeof(uint64): {}", sizeof(uint64));
std::println("SECCAMP_PLATFORM_NAME: {}", SECCAMP_PLATFORM_NAME);
std::println("SECCAMP_COMPILER_NAME: {}", SECCAMP_COMPILER_NAME);
std::println("SECCAMP_BUILD_TYPE: {}", SECCAMP_BUILD_TYPE);
#if SECCAMP_PLATFORM(WINDOWS)
std::println("Windows");
#elif SECCAMP_PLATFORM(MACOS)
std::println("macOS");
#elif SECCAMP_PLATFORM(LINUX)
std::println("Linux");
#else
std::println("Other");
#endif
#if SECCAMP_COMPILER(MSVC)
std::println("MSVC");
#elif SECCAMP_COMPILER(GCC)
std::println("GCC");
#elif SECCAMP_COMPILER(APPLE_CLANG)
std::println("Apple Clang");
#else
std::println("Other");
#endif
#if SECCAMP_BUILD(DEBUG)
std::println("Debug");
#else
std::println("Release");
#endif
}
std::println("---- Utility.hpp ----");
{
std::println("IsEven(20): {}", IsEven(20));
std::println("IsEven(21): {}", IsEven(21));
std::println("IsOdd(20): {}", IsOdd(20));
std::println("IsOdd(21): {}", IsOdd(21));
std::println("ToLower(\"Hello, seccamp!\"): {}", ToLower("Hello, seccamp!"));
std::println("ToUpper(\"Hello, seccamp!\"): {}", ToUpper("Hello, seccamp!"));
}
std::println("---- Point.hpp ----");
{
std::println("{}", Point{ 100, 200 } + Point{ 1, 2 });
std::println("{}", 2 * Point{ 100, 200 });
std::println("{}", Point{ 1, 2 } == Point{ 1, 2 });
}
std::println("---- FileSystem.hpp ----");
{
std::println("FileSystem::FullPath(\"test.txt\"): {}", FileSystem::FullPath("test.txt"));
std::println("FileSystem::Extension(\"test.txt\"): {}", FileSystem::Extension("test.txt"));
std::println("FileSystem::Extension(\"test\"): {}", FileSystem::Extension("test"));
}
std::println("---- Timer.hpp ----");
{
Timer timer;
Sleep(200);
timer.print();
}
std::println("---- BinaryFileWriter.hpp ----");
{
BinaryFileWriter writer{ "test.bin" };
std::println("writer.isOpen(): {}", writer.isOpen());
std::println("writer.fullPath(): {}", writer.fullPath());
const std::string str = "Hello, seccamp!";
const uint64 length = str.size();
writer.write(length);
writer.write(str.data(), str.size());
const int32 a = 123;
const double b = 1.25;
const Point p{ 100, 200 };
writer.write(a);
writer.write(b);
writer.write(p);
}
std::println("---- BinaryFileReader.hpp ----");
{
BinaryFileReader reader{ "test.bin" };
std::println("reader.isOpen(): {}", reader.isOpen());
std::println("reader.fullPath(): {}", reader.fullPath());
std::println("reader.size(): {}", reader.size());
uint64 length;
reader.read(length);
std::println("length: {}", length);
std::string str;
str.resize(length);
reader.read(str.data(), str.size());
std::println("str: {}", str);
int32 a;
double b;
Point p;
reader.read(a);
reader.read(b);
reader.read(p);
std::println("a: {}", a);
std::println("b: {}", b);
std::println("p: {}", p);
}
std::println("---- TextFileWriter.hpp ----");
{
TextFileWriter writer{ "test.txt" };
std::println("writer.isOpen(): {}", writer.isOpen());
std::println("writer.fullPath(): {}", writer.fullPath());
writer.writeln("Hello, seccamp!");
writer.writeln("こんにちは!");
writer.writeln("");
writer.writeln("{}/{}/{}", 2024, 8, 13);
}
std::println("---- TextFileReader.hpp ----");
{
TextFileReader reader{ "test.txt" };
std::println("reader.isOpen(): {}", reader.isOpen());
std::println("reader.fullPath(): {}", reader.fullPath());
std::string line;
while (reader.readLine(line))
{
std::println("{}", line);
}
}
std::println("---- Color.hpp ----");
{
std::println("{}", Color{ 255 });
std::println("{}", Color{ 0, 255, 0 });
std::println("{}", Color{ 0, 0, 255, 128 });
std::println("{}", Color{ 11, 22, 33 }.grayscaleUint8());
std::println("{}", Color{ 11, 22, 33 }.grayscale());
std::println("{}", Palette::Black);
std::println("{}", Palette::White);
}
std::println("---- Image.hpp & BMP.hpp ----");
{
{
Image image(Size{ 400, 300 }, Color{ 220, 240, 255 });
for (int32 y = 40; y < 60; ++y)
{
for (int32 x = 0; x < image.width(); ++x)
{
image[y][x] = Palette::Black;
}
}
image.save("image.bmp");
}
{
Image image{ "image.bmp" };
for (int32 y = 0; y < image.height(); ++y)
{
for (int32 x = 40; x < 60; ++x)
{
image[y][x] = Palette::White;
}
}
image.save("image2.bmp");
}
{
Image image{ "seccamp.bmp" };
for (auto& pixel : image)
{
pixel = Color{ pixel.grayscaleUint8() };
}
image.save("seccamp_gray.bmp");
}
}
}