diff options
Diffstat (limited to 'works/life/cpp-practicum')
| -rw-r--r-- | works/life/cpp-practicum/.gitignore | 597 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Base.hpp | 25 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Book.cpp | 36 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Book.hpp | 51 | ||||
| -rw-r--r-- | works/life/cpp-practicum/CMakeLists.txt | 33 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Record.cpp | 343 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Record.hpp | 76 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Vendor.cpp | 33 | ||||
| -rw-r--r-- | works/life/cpp-practicum/Vendor.hpp | 45 | ||||
| -rw-r--r-- | works/life/cpp-practicum/main.cpp | 122 | ||||
| -rw-r--r-- | works/life/cpp-practicum/vcpkg.json | 6 | 
11 files changed, 0 insertions, 1367 deletions
| diff --git a/works/life/cpp-practicum/.gitignore b/works/life/cpp-practicum/.gitignore deleted file mode 100644 index 42ea155..0000000 --- a/works/life/cpp-practicum/.gitignore +++ /dev/null @@ -1,597 +0,0 @@ -
 -# Created by https://www.gitignore.io/api/c++,cmake,python,visualstudio,visualstudiocode
 -# Edit at https://www.gitignore.io/?templates=c++,cmake,python,visualstudio,visualstudiocode
 -
 -### C++ ###
 -# Prerequisites
 -*.d
 -
 -# Compiled Object files
 -*.slo
 -*.lo
 -*.o
 -*.obj
 -
 -# Precompiled Headers
 -*.gch
 -*.pch
 -
 -# Compiled Dynamic libraries
 -*.so
 -*.dylib
 -*.dll
 -
 -# Fortran module files
 -*.mod
 -*.smod
 -
 -# Compiled Static libraries
 -*.lai
 -*.la
 -*.a
 -*.lib
 -
 -# Executables
 -*.exe
 -*.out
 -*.app
 -
 -### CMake ###
 -CMakeLists.txt.user
 -CMakeCache.txt
 -CMakeFiles
 -CMakeScripts
 -Testing
 -Makefile
 -cmake_install.cmake
 -install_manifest.txt
 -compile_commands.json
 -CTestTestfile.cmake
 -_deps
 -
 -### CMake Patch ###
 -# External projects
 -*-prefix/
 -
 -### Python ###
 -# Byte-compiled / optimized / DLL files
 -__pycache__/
 -*.py[cod]
 -*$py.class
 -
 -# C extensions
 -
 -# Distribution / packaging
 -.Python
 -build/
 -develop-eggs/
 -dist/
 -downloads/
 -eggs/
 -.eggs/
 -lib/
 -lib64/
 -parts/
 -sdist/
 -var/
 -wheels/
 -pip-wheel-metadata/
 -share/python-wheels/
 -*.egg-info/
 -.installed.cfg
 -*.egg
 -MANIFEST
 -
 -# PyInstaller
 -#  Usually these files are written by a python script from a template
 -#  before PyInstaller builds the exe, so as to inject date/other infos into it.
 -*.manifest
 -*.spec
 -
 -# Installer logs
 -pip-log.txt
 -pip-delete-this-directory.txt
 -
 -# Unit test / coverage reports
 -htmlcov/
 -.tox/
 -.nox/
 -.coverage
 -.coverage.*
 -.cache
 -nosetests.xml
 -coverage.xml
 -*.cover
 -.hypothesis/
 -.pytest_cache/
 -
 -# Translations
 -*.mo
 -*.pot
 -
 -# Django stuff:
 -*.log
 -local_settings.py
 -db.sqlite3
 -
 -# Flask stuff:
 -instance/
 -.webassets-cache
 -
 -# Scrapy stuff:
 -.scrapy
 -
 -# Sphinx documentation
 -docs/_build/
 -
 -# PyBuilder
 -target/
 -
 -# Jupyter Notebook
 -.ipynb_checkpoints
 -
 -# IPython
 -profile_default/
 -ipython_config.py
 -
 -# pyenv
 -.python-version
 -
 -# pipenv
 -#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
 -#   However, in case of collaboration, if having platform-specific dependencies or dependencies
 -#   having no cross-platform support, pipenv may install dependencies that don’t work, or not
 -#   install all needed dependencies.
 -#Pipfile.lock
 -
 -# celery beat schedule file
 -celerybeat-schedule
 -
 -# SageMath parsed files
 -*.sage.py
 -
 -# Environments
 -.env
 -.venv
 -env/
 -venv/
 -ENV/
 -env.bak/
 -venv.bak/
 -
 -# Spyder project settings
 -.spyderproject
 -.spyproject
 -
 -# Rope project settings
 -.ropeproject
 -
 -# mkdocs documentation
 -/site
 -
 -# mypy
 -.mypy_cache/
 -.dmypy.json
 -dmypy.json
 -
 -# Pyre type checker
 -.pyre/
 -
 -### VisualStudioCode ###
 -.vscode/*
 -!.vscode/c_cpp_properties.json
 -!.vscode/settings.json
 -!.vscode/tasks.json
 -!.vscode/launch.json
 -!.vscode/extensions.json
 -
 -### VisualStudioCode Patch ###
 -# Ignore all local history of files
 -.history
 -
 -### VisualStudio ###
 -## Ignore Visual Studio temporary files, build results, and
 -## files generated by popular Visual Studio add-ons.
 -##
 -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
 -
 -# User-specific files
 -*.rsuser
 -*.suo
 -*.user
 -*.userosscache
 -*.sln.docstates
 -
 -# User-specific files (MonoDevelop/Xamarin Studio)
 -*.userprefs
 -
 -# Mono auto generated files
 -mono_crash.*
 -
 -# Build results
 -[Dd]ebug/
 -[Dd]ebugPublic/
 -[Rr]elease/
 -[Rr]eleases/
 -x64/
 -x86/
 -[Aa][Rr][Mm]/
 -[Aa][Rr][Mm]64/
 -bld/
 -[Bb]in/
 -[Oo]bj/
 -[Ll]og/
 -
 -# Visual Studio 2015/2017 cache/options directory
 -.vs/
 -# Uncomment if you have tasks that create the project's static files in wwwroot
 -#wwwroot/
 -
 -# Visual Studio 2017 auto generated files
 -Generated\ Files/
 -
 -# MSTest test Results
 -[Tt]est[Rr]esult*/
 -[Bb]uild[Ll]og.*
 -
 -# NUNIT
 -*.VisualState.xml
 -TestResult.xml
 -
 -# Build Results of an ATL Project
 -[Dd]ebugPS/
 -[Rr]eleasePS/
 -dlldata.c
 -
 -# Benchmark Results
 -BenchmarkDotNet.Artifacts/
 -
 -# .NET Core
 -project.lock.json
 -project.fragment.lock.json
 -artifacts/
 -
 -# StyleCop
 -StyleCopReport.xml
 -
 -# Files built by Visual Studio
 -*_i.c
 -*_p.c
 -*_h.h
 -*.ilk
 -*.meta
 -*.iobj
 -*.pdb
 -*.ipdb
 -*.pgc
 -*.pgd
 -*.rsp
 -*.sbr
 -*.tlb
 -*.tli
 -*.tlh
 -*.tmp
 -*.tmp_proj
 -*_wpftmp.csproj
 -*.vspscc
 -*.vssscc
 -.builds
 -*.pidb
 -*.svclog
 -*.scc
 -
 -# Chutzpah Test files
 -_Chutzpah*
 -
 -# Visual C++ cache files
 -ipch/
 -*.aps
 -*.ncb
 -*.opendb
 -*.opensdf
 -*.sdf
 -*.cachefile
 -*.VC.db
 -*.VC.VC.opendb
 -
 -# Visual Studio profiler
 -*.psess
 -*.vsp
 -*.vspx
 -*.sap
 -
 -# Visual Studio Trace Files
 -*.e2e
 -
 -# TFS 2012 Local Workspace
 -$tf/
 -
 -# Guidance Automation Toolkit
 -*.gpState
 -
 -# ReSharper is a .NET coding add-in
 -_ReSharper*/
 -*.[Rr]e[Ss]harper
 -*.DotSettings.user
 -
 -# JustCode is a .NET coding add-in
 -.JustCode
 -
 -# TeamCity is a build add-in
 -_TeamCity*
 -
 -# DotCover is a Code Coverage Tool
 -*.dotCover
 -
 -# AxoCover is a Code Coverage Tool
 -.axoCover/*
 -!.axoCover/settings.json
 -
 -# Visual Studio code coverage results
 -*.coverage
 -*.coveragexml
 -
 -# NCrunch
 -_NCrunch_*
 -.*crunch*.local.xml
 -nCrunchTemp_*
 -
 -# MightyMoose
 -*.mm.*
 -AutoTest.Net/
 -
 -# Web workbench (sass)
 -.sass-cache/
 -
 -# Installshield output folder
 -[Ee]xpress/
 -
 -# DocProject is a documentation generator add-in
 -DocProject/buildhelp/
 -DocProject/Help/*.HxT
 -DocProject/Help/*.HxC
 -DocProject/Help/*.hhc
 -DocProject/Help/*.hhk
 -DocProject/Help/*.hhp
 -DocProject/Help/Html2
 -DocProject/Help/html
 -
 -# Click-Once directory
 -publish/
 -
 -# Publish Web Output
 -*.[Pp]ublish.xml
 -*.azurePubxml
 -# Note: Comment the next line if you want to checkin your web deploy settings,
 -# but database connection strings (with potential passwords) will be unencrypted
 -*.pubxml
 -*.publishproj
 -
 -# Microsoft Azure Web App publish settings. Comment the next line if you want to
 -# checkin your Azure Web App publish settings, but sensitive information contained
 -# in these scripts will be unencrypted
 -PublishScripts/
 -
 -# NuGet Packages
 -*.nupkg
 -# The packages folder can be ignored because of Package Restore
 -**/[Pp]ackages/*
 -# except build/, which is used as an MSBuild target.
 -!**/[Pp]ackages/build/
 -# Uncomment if necessary however generally it will be regenerated when needed
 -#!**/[Pp]ackages/repositories.config
 -# NuGet v3's project.json files produces more ignorable files
 -*.nuget.props
 -*.nuget.targets
 -
 -# Microsoft Azure Build Output
 -csx/
 -*.build.csdef
 -
 -# Microsoft Azure Emulator
 -ecf/
 -rcf/
 -
 -# Windows Store app package directories and files
 -AppPackages/
 -BundleArtifacts/
 -Package.StoreAssociation.xml
 -_pkginfo.txt
 -*.appx
 -*.appxbundle
 -*.appxupload
 -
 -# Visual Studio cache files
 -# files ending in .cache can be ignored
 -*.[Cc]ache
 -# but keep track of directories ending in .cache
 -!?*.[Cc]ache/
 -
 -# Others
 -ClientBin/
 -~$*
 -*~
 -*.dbmdl
 -*.dbproj.schemaview
 -*.jfm
 -*.pfx
 -*.publishsettings
 -orleans.codegen.cs
 -
 -# Including strong name files can present a security risk
 -# (https://github.com/github/gitignore/pull/2483#issue-259490424)
 -#*.snk
 -
 -# Since there are multiple workflows, uncomment next line to ignore bower_components
 -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
 -#bower_components/
 -
 -# RIA/Silverlight projects
 -Generated_Code/
 -
 -# Backup & report files from converting an old project file
 -# to a newer Visual Studio version. Backup files are not needed,
 -# because we have git ;-)
 -_UpgradeReport_Files/
 -Backup*/
 -UpgradeLog*.XML
 -UpgradeLog*.htm
 -ServiceFabricBackup/
 -*.rptproj.bak
 -
 -# SQL Server files
 -*.mdf
 -*.ldf
 -*.ndf
 -
 -# Business Intelligence projects
 -*.rdl.data
 -*.bim.layout
 -*.bim_*.settings
 -*.rptproj.rsuser
 -*- Backup*.rdl
 -
 -# Microsoft Fakes
 -FakesAssemblies/
 -
 -# GhostDoc plugin setting file
 -*.GhostDoc.xml
 -
 -# Node.js Tools for Visual Studio
 -.ntvs_analysis.dat
 -node_modules/
 -
 -# Visual Studio 6 build log
 -*.plg
 -
 -# Visual Studio 6 workspace options file
 -*.opt
 -
 -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
 -*.vbw
 -
 -# Visual Studio LightSwitch build output
 -**/*.HTMLClient/GeneratedArtifacts
 -**/*.DesktopClient/GeneratedArtifacts
 -**/*.DesktopClient/ModelManifest.xml
 -**/*.Server/GeneratedArtifacts
 -**/*.Server/ModelManifest.xml
 -_Pvt_Extensions
 -
 -# Paket dependency manager
 -.paket/paket.exe
 -paket-files/
 -
 -# FAKE - F# Make
 -.fake/
 -
 -# CodeRush personal settings
 -.cr/personal
 -
 -# Python Tools for Visual Studio (PTVS)
 -*.pyc
 -
 -# Cake - Uncomment if you are using it
 -# tools/**
 -# !tools/packages.config
 -
 -# Tabs Studio
 -*.tss
 -
 -# Telerik's JustMock configuration file
 -*.jmconfig
 -
 -# BizTalk build output
 -*.btp.cs
 -*.btm.cs
 -*.odx.cs
 -*.xsd.cs
 -
 -# OpenCover UI analysis results
 -OpenCover/
 -
 -# Azure Stream Analytics local run output
 -ASALocalRun/
 -
 -# MSBuild Binary and Structured Log
 -*.binlog
 -
 -# NVidia Nsight GPU debugger configuration file
 -*.nvuser
 -
 -# MFractors (Xamarin productivity tool) working folder
 -.mfractor/
 -
 -# Local History for Visual Studio
 -.localhistory/
 -
 -# BeatPulse healthcheck temp database
 -healthchecksdb
 -
 -# Backup folder for Package Reference Convert tool in Visual Studio 2017
 -MigrationBackup/
 -
 -# End of https://www.gitignore.io/api/c++,cmake,python,visualstudio,visualstudiocode
 -
 -# Created by https://www.gitignore.io/api/emacs
 -# Edit at https://www.gitignore.io/?templates=emacs
 -
 -### Emacs ###
 -# -*- mode: gitignore; -*-
 -*~
 -\#*\#
 -/.emacs.desktop
 -/.emacs.desktop.lock
 -*.elc
 -auto-save-list
 -tramp
 -.\#*
 -
 -# Org-mode
 -.org-id-locations
 -*_archive
 -
 -# flymake-mode
 -*_flymake.*
 -
 -# eshell files
 -/eshell/history
 -/eshell/lastdir
 -
 -# elpa packages
 -/elpa/
 -
 -# reftex files
 -*.rel
 -
 -# AUCTeX auto folder
 -/auto/
 -
 -# cask packages
 -.cask/
 -dist/
 -
 -# Flycheck
 -flycheck_*.el
 -
 -# server auth directory
 -/server/
 -
 -# projectiles files
 -.projectile
 -
 -# directory configuration
 -.dir-locals.el
 -
 -# network security
 -/network-security.data
 -
 -
 -# End of https://www.gitignore.io/api/emacs
 -
 -compile_flags.txt
 -.clangd
 -.kdev4
 -CruUI.kdev4
 -
 -vcpkg_installed
 diff --git a/works/life/cpp-practicum/Base.hpp b/works/life/cpp-practicum/Base.hpp deleted file mode 100644 index 44a9d6c..0000000 --- a/works/life/cpp-practicum/Base.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once
 -
 -#include <exception>
 -#include <stdexcept>
 -
 -#define CRU_DEFAULT_COPY(classname)                                            \
 -  classname(const classname &) = default;                                      \
 -  classname &operator=(const classname &) = default;
 -
 -#define CRU_DEFAULT_MOVE(classname)                                            \
 -  classname(classname &&) = default;                                           \
 -  classname &operator=(classname &&) = default;
 -
 -#define CRU_DELETE_COPY(classname)                                             \
 -  classname(const classname &) = delete;                                       \
 -  classname &operator=(const classname &) = delete;
 -
 -#define CRU_DELETE_MOVE(classname)                                             \
 -  classname(classname &&) = delete;                                            \
 -  classname &operator=(classname &&) = delete;
 -
 -class SerializationException : public std::runtime_error {
 -public:
 -  using runtime_error::runtime_error;
 -};
 diff --git a/works/life/cpp-practicum/Book.cpp b/works/life/cpp-practicum/Book.cpp deleted file mode 100644 index bf67d7c..0000000 --- a/works/life/cpp-practicum/Book.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "Book.hpp"
 -
 -#include <QString>
 -
 -QTextStream &operator>>(QTextStream &left, Book &right) {
 -  auto line = left.readLine();
 -
 -  auto fields = line.split(QChar('|'));
 -
 -  if (fields.size() != 6) {
 -    throw SerializationException("The line has not 6 parts.");
 -  }
 -
 -  right.SetIsbn(fields[0].toStdU16String());
 -  right.SetTitle(fields[1].toStdU16String());
 -  right.SetType(fields[2].toStdU16String());
 -  right.SetAuthor(fields[3].toStdU16String());
 -  right.SetPress(fields[4].toStdU16String());
 -
 -  bool ok;
 -  auto stock_count = fields[5].toInt(&ok);
 -  if (!ok) {
 -    throw SerializationException("Part 6 is not a number.");
 -  }
 -
 -  right.SetStockCount(stock_count);
 -
 -  return left;
 -}
 -
 -QTextStream &operator<<(QTextStream &left, const Book &right) {
 -  left << right.GetIsbn() << '|' << right.GetTitle() << '|' << right.GetType()
 -       << '|' << right.GetAuthor() << '|' << right.GetPress() << '|'
 -       << right.GetStockCount();
 -  return left;
 -}
 diff --git a/works/life/cpp-practicum/Book.hpp b/works/life/cpp-practicum/Book.hpp deleted file mode 100644 index 250460f..0000000 --- a/works/life/cpp-practicum/Book.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once
 -#include "Base.hpp"
 -
 -#include <QTextStream>
 -#include <string>
 -
 -class Book final {
 -public:
 -  Book() = default;
 -
 -  Book(std::u16string isbn, std::u16string title, std::u16string type,
 -       std::u16string author, std::u16string press, int stock_count)
 -      : isbn_(std::move(isbn)), title_(std::move(title)),
 -        type_(std::move(type)), author_(std::move(author)),
 -        press_(std::move(press)), stock_count_(stock_count) {}
 -
 -  CRU_DEFAULT_COPY(Book)
 -  CRU_DEFAULT_MOVE(Book)
 -
 -  ~Book() = default;
 -
 -public:
 -  std::u16string GetIsbn() const { return isbn_; }
 -  void SetIsbn(std::u16string isbn) { isbn_ = std::move(isbn); }
 -
 -  std::u16string GetTitle() const { return title_; }
 -  void SetTitle(std::u16string title) { title_ = std::move(title); }
 -
 -  std::u16string GetType() const { return type_; }
 -  void SetType(std::u16string type) { type_ = std::move(type); }
 -
 -  std::u16string GetAuthor() const { return author_; }
 -  void SetAuthor(std::u16string author) { author_ = std::move(author); }
 -
 -  std::u16string GetPress() const { return press_; }
 -  void SetPress(std::u16string press) { press_ = std::move(press); }
 -
 -  int GetStockCount() const { return stock_count_; }
 -  void SetStockCount(int stock_count) { stock_count_ = stock_count; }
 -
 -private:
 -  std::u16string isbn_;
 -  std::u16string title_;
 -  std::u16string type_;
 -  std::u16string author_;
 -  std::u16string press_;
 -  int stock_count_ = 0;
 -};
 -
 -QTextStream &operator>>(QTextStream &left, Book &right);
 -QTextStream &operator<<(QTextStream &left, const Book &right);
 diff --git a/works/life/cpp-practicum/CMakeLists.txt b/works/life/cpp-practicum/CMakeLists.txt deleted file mode 100644 index 346fdb4..0000000 --- a/works/life/cpp-practicum/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -cmake_minimum_required(VERSION 3.14)
 -
 -set(CMAKE_TOOLCHAIN_FILE $ENV{VCPKG_INSTALLATION_ROOT}/scripts/buildsystems/vcpkg.cmake
 -  CACHE STRING "Vcpkg toolchain file")
 -
 -project(CppPraticum)
 -
 -enable_testing()
 -
 -set(CMAKE_CXX_STANDARD 17)
 -
 -if (MSVC)
 -	string(REGEX REPLACE "/W[0-4]\\s*" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
 -	add_compile_options(/utf-8 /W4 /WX)
 -endif()
 -
 -find_package(Qt5Core CONFIG REQUIRED)
 -find_package(Qt5Gui CONFIG REQUIRED)
 -find_package(Qt5Widgets CONFIG REQUIRED)
 -
 -add_executable(main
 -	Base.hpp
 -
 -	Book.hpp
 -	Book.cpp
 -	Vendor.hpp
 -	Vendor.cpp
 -	Record.hpp
 -	Record.cpp
 -
 -	main.cpp
 -)
 -target_link_libraries(main PRIVATE Qt5::Core Qt5::Widgets Qt5::Gui)
 diff --git a/works/life/cpp-practicum/Record.cpp b/works/life/cpp-practicum/Record.cpp deleted file mode 100644 index bdee28b..0000000 --- a/works/life/cpp-practicum/Record.cpp +++ /dev/null @@ -1,343 +0,0 @@ -#include "Record.hpp"
 -
 -#include <algorithm>
 -
 -void Record::WriteTo(QTextStream &stream) {
 -  stream << books_.size() << ' ' << vendors_.size() << '\n';
 -  for (const auto &book : books_) {
 -    stream << book << '\n';
 -  }
 -  for (const auto &vendor : vendors_) {
 -    stream << vendor << '\n';
 -  }
 -}
 -
 -void Record::ReadFrom(QTextStream &stream) {
 -  books_.clear();
 -  vendors_.clear();
 -
 -  int book_count, vendor_count;
 -  stream >> book_count >> vendor_count;
 -  stream.skipWhiteSpace();
 -  for (int i = 0; i < book_count; i++) {
 -    Book book;
 -    stream >> book;
 -    books_.push_back(std::move(book));
 -  }
 -  for (int i = 0; i < vendor_count; i++) {
 -    Vendor vendor;
 -    stream >> vendor;
 -    vendors_.push_back(std::move(vendor));
 -  }
 -}
 -
 -int BookModel::rowCount(const QModelIndex &parent) const {
 -  if (parent.isValid())
 -    return 0;
 -  return static_cast<int>(record_->GetBooks().size());
 -}
 -
 -int BookModel::columnCount(const QModelIndex &parent) const {
 -  if (parent.isValid())
 -    return 0;
 -  return 6;
 -}
 -
 -QVariant BookModel::headerData(int section, Qt::Orientation orientation,
 -                               int role) const {
 -  if (role != Qt::DisplayRole)
 -    return QVariant();
 -  if (orientation == Qt::Horizontal) {
 -    switch (section) {
 -    case 0:
 -      return QStringLiteral("ISBN");
 -    case 1:
 -      return QStringLiteral("标题");
 -    case 2:
 -      return QStringLiteral("类型");
 -    case 3:
 -      return QStringLiteral("作者");
 -    case 4:
 -      return QStringLiteral("出版社");
 -    case 5:
 -      return QStringLiteral("库存");
 -    default:
 -      return QVariant();
 -    }
 -  }
 -  return QVariant();
 -}
 -
 -QVariant BookModel::data(const QModelIndex &index, int role) const {
 -  if (role != Qt::DisplayRole)
 -    return QVariant();
 -
 -  if (!index.isValid())
 -    return QVariant();
 -
 -  if (index.row() >= static_cast<int>(record_->GetBooks().size()) ||
 -      index.row() < 0)
 -    return QVariant();
 -
 -  int row = index.row();
 -  const Book &book = record_->GetBooks()[row];
 -
 -  int col = index.column();
 -  switch (col) {
 -  case 0:
 -    return QString::fromStdU16String(book.GetIsbn());
 -  case 1:
 -    return QString::fromStdU16String(book.GetTitle());
 -  case 2:
 -    return QString::fromStdU16String(book.GetType());
 -  case 3:
 -    return QString::fromStdU16String(book.GetAuthor());
 -  case 4:
 -    return QString::fromStdU16String(book.GetPress());
 -  case 5:
 -    return book.GetStockCount();
 -  default:
 -    return QVariant();
 -  }
 -}
 -
 -bool BookModel::setData(const QModelIndex &index, const QVariant &value,
 -                        int role) {
 -  if (index.isValid() && role == Qt::EditRole) {
 -    int row = index.row();
 -    Book &book = record_->GetBooks()[row];
 -
 -    int col = index.column();
 -    switch (col) {
 -    case 0:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      book.SetIsbn(value.toString().toStdU16String());
 -      return true;
 -    case 1:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      book.SetTitle(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 2:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      book.SetType(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 3:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      book.SetAuthor(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 4:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      book.SetPress(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 5:
 -      if (!value.canConvert<int>())
 -        return false;
 -      book.SetStockCount(value.toInt());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    default:
 -      return false;
 -    }
 -  }
 -  return false;
 -}
 -
 -Qt::ItemFlags BookModel::flags(const QModelIndex &index) const {
 -  if (!index.isValid())
 -    return Qt::ItemIsEnabled;
 -
 -  return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
 -}
 -
 -bool BookModel::insertRows(int row, int count, const QModelIndex &parent) {
 -  beginInsertRows(parent, row, row + count - 1);
 -  for (int i = 0; i < count; i++) {
 -    record_->GetBooks().insert(record_->GetBooks().cbegin() + row, Book());
 -  }
 -  endInsertRows();
 -  return true;
 -}
 -
 -bool BookModel::removeRows(int row, int count, const QModelIndex &parent) {
 -  beginRemoveRows(parent, row, row + count - 1);
 -  record_->GetBooks().erase(record_->GetBooks().cbegin() + row,
 -                            record_->GetBooks().cbegin() + row + count);
 -  endRemoveRows();
 -  return true;
 -}
 -
 -void BookModel::sort(int column, Qt::SortOrder order) {
 -  if (column == 0) {
 -    beginResetModel();
 -    if (order == Qt::AscendingOrder) {
 -      std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
 -                [](const Book &left, const Book &right) {
 -                  return left.GetIsbn() < right.GetIsbn();
 -                });
 -    } else {
 -      std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
 -                [](const Book &left, const Book &right) {
 -                  return left.GetIsbn() > right.GetIsbn();
 -                });
 -    }
 -    endResetModel();
 -  } else if (column == 1) {
 -    beginResetModel();
 -    if (order == Qt::AscendingOrder) {
 -      std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
 -                [](const Book &left, const Book &right) {
 -                  return left.GetTitle() < right.GetTitle();
 -                });
 -    } else {
 -      std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
 -                [](const Book &left, const Book &right) {
 -                  return left.GetTitle() > right.GetTitle();
 -                });
 -    }
 -    endResetModel();
 -  }
 -}
 -
 -int VendorModel::rowCount(const QModelIndex &parent) const {
 -  if (parent.isValid())
 -    return 0;
 -  return static_cast<int>(record_->GetVendors().size());
 -}
 -
 -int VendorModel::columnCount(const QModelIndex &parent) const {
 -  if (parent.isValid())
 -    return 0;
 -  return 5;
 -}
 -
 -QVariant VendorModel::headerData(int section, Qt::Orientation orientation,
 -                                 int role) const {
 -  if (role != Qt::DisplayRole)
 -    return QVariant();
 -  if (orientation == Qt::Horizontal) {
 -    switch (section) {
 -    case 0:
 -      return QStringLiteral("编号");
 -    case 1:
 -      return QStringLiteral("名称");
 -    case 2:
 -      return QStringLiteral("类型");
 -    case 3:
 -      return QStringLiteral("地址");
 -    case 4:
 -      return QStringLiteral("电话");
 -    default:
 -      return QVariant();
 -    }
 -  }
 -  return QVariant();
 -}
 -
 -QVariant VendorModel::data(const QModelIndex &index, int role) const {
 -  if (role != Qt::DisplayRole)
 -    return QVariant();
 -
 -  if (!index.isValid())
 -    return QVariant();
 -
 -  if (index.row() >= static_cast<int>(record_->GetVendors().size()) ||
 -      index.row() < 0)
 -    return QVariant();
 -
 -  int row = index.row();
 -  const Vendor &vendor = record_->GetVendors()[row];
 -
 -  int col = index.column();
 -  switch (col) {
 -  case 0:
 -    return vendor.GetId();
 -  case 1:
 -    return QString::fromStdU16String(vendor.GetName());
 -  case 2:
 -    return QString::fromStdU16String(vendor.GetType());
 -  case 3:
 -    return QString::fromStdU16String(vendor.GetAddress());
 -  case 4:
 -    return QString::fromStdU16String(vendor.GetPhone());
 -  default:
 -    return QVariant();
 -  }
 -}
 -
 -bool VendorModel::setData(const QModelIndex &index, const QVariant &value,
 -                          int role) {
 -  if (index.isValid() && role == Qt::EditRole) {
 -    int row = index.row();
 -    Vendor &vendor = record_->GetVendors()[row];
 -
 -    int col = index.column();
 -    switch (col) {
 -    case 0:
 -      if (!value.canConvert<int>())
 -        return false;
 -      vendor.SetId(value.toInt());
 -      return true;
 -    case 1:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      vendor.SetName(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 2:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      vendor.SetType(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 3:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      vendor.SetAddress(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    case 4:
 -      if (!value.canConvert<QString>())
 -        return false;
 -      vendor.SetPhone(value.toString().toStdU16String());
 -      emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
 -      return true;
 -    default:
 -      return false;
 -    }
 -  }
 -  return false;
 -}
 -
 -Qt::ItemFlags VendorModel::flags(const QModelIndex &index) const {
 -  if (!index.isValid())
 -    return Qt::ItemIsEnabled;
 -
 -  return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
 -}
 -
 -bool VendorModel::insertRows(int row, int count, const QModelIndex &parent) {
 -  beginInsertRows(parent, row, row + count - 1);
 -  for (int i = 0; i < count; i++) {
 -    record_->GetVendors().insert(record_->GetVendors().cbegin() + row,
 -                                 Vendor());
 -  }
 -  endInsertRows();
 -  return true;
 -}
 -
 -bool VendorModel::removeRows(int row, int count, const QModelIndex &parent) {
 -  beginRemoveRows(parent, row, row + count - 1);
 -  record_->GetVendors().erase(record_->GetVendors().cbegin() + row,
 -                              record_->GetVendors().cbegin() + row + count);
 -  endRemoveRows();
 -  return true;
 -}
 diff --git a/works/life/cpp-practicum/Record.hpp b/works/life/cpp-practicum/Record.hpp deleted file mode 100644 index c379f04..0000000 --- a/works/life/cpp-practicum/Record.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once
 -#include "Base.hpp"
 -
 -#include "Book.hpp"
 -#include "Vendor.hpp"
 -
 -#include <QAbstractTableModel>
 -#include <QTextStream>
 -#include <optional>
 -#include <vector>
 -
 -class Record final {
 -public:
 -  Record() = default;
 -
 -  CRU_DEFAULT_COPY(Record);
 -  CRU_DEFAULT_MOVE(Record);
 -
 -  ~Record() = default;
 -
 -public:
 -  void WriteTo(QTextStream &stream);
 -  void ReadFrom(QTextStream &stream);
 -
 -  std::vector<Book> &GetBooks() { return books_; }
 -  std::vector<Vendor> &GetVendors() { return vendors_; }
 -
 -private:
 -  std::vector<Book> books_;
 -  std::vector<Vendor> vendors_;
 -};
 -
 -class BookModel : public QAbstractTableModel {
 -public:
 -  explicit BookModel(Record *record) : record_(record) {}
 -
 -  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
 -  int columnCount(const QModelIndex &parent = QModelIndex()) const override;
 -  QVariant headerData(int section, Qt::Orientation orientation,
 -                      int role = Qt::DisplayRole) const override;
 -  QVariant data(const QModelIndex &index,
 -                int role = Qt::DisplayRole) const override;
 -  bool setData(const QModelIndex &index, const QVariant &value,
 -               int role = Qt::EditRole) override;
 -  Qt::ItemFlags flags(const QModelIndex &index) const override;
 -  bool insertRows(int row, int count,
 -                  const QModelIndex &parent = QModelIndex()) override;
 -  bool removeRows(int row, int count,
 -                  const QModelIndex &parent = QModelIndex()) override;
 -  void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
 -
 -private:
 -  Record *record_;
 -};
 -
 -class VendorModel : public QAbstractTableModel {
 -public:
 -  explicit VendorModel(Record *record) : record_(record) {}
 -
 -  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
 -  int columnCount(const QModelIndex &parent = QModelIndex()) const override;
 -  QVariant headerData(int section, Qt::Orientation orientation,
 -                      int role = Qt::DisplayRole) const override;
 -  QVariant data(const QModelIndex &index,
 -                int role = Qt::DisplayRole) const override;
 -  bool setData(const QModelIndex &index, const QVariant &value,
 -               int role = Qt::EditRole) override;
 -  Qt::ItemFlags flags(const QModelIndex &index) const override;
 -  bool insertRows(int row, int count,
 -                  const QModelIndex &parent = QModelIndex()) override;
 -  bool removeRows(int row, int count,
 -                  const QModelIndex &parent = QModelIndex()) override;
 -
 -private:
 -  Record *record_;
 -};
 diff --git a/works/life/cpp-practicum/Vendor.cpp b/works/life/cpp-practicum/Vendor.cpp deleted file mode 100644 index 7544451..0000000 --- a/works/life/cpp-practicum/Vendor.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "Vendor.hpp"
 -
 -#include <QString>
 -
 -QTextStream &operator>>(QTextStream &left, Vendor &right) {
 -  auto line = left.readLine();
 -
 -  auto fields = line.split(QChar('|'));
 -
 -  if (fields.size() != 5) {
 -    throw SerializationException("Line has not 5 parts.");
 -  }
 -
 -  bool ok;
 -  auto id = fields[0].toInt(&ok);
 -  if (!ok) {
 -    throw SerializationException("Part 1 is not a number.");
 -  }
 -
 -  right.SetId(id);
 -  right.SetName(fields[1].toStdU16String());
 -  right.SetType(fields[2].toStdU16String());
 -  right.SetAddress(fields[3].toStdU16String());
 -  right.SetPhone(fields[4].toStdU16String());
 -
 -  return left;
 -}
 -
 -QTextStream &operator<<(QTextStream &left, const Vendor &right) {
 -  left << right.GetId() << '|' << right.GetName() << '|' << right.GetType()
 -       << '|' << right.GetAddress() << '|' << right.GetPhone();
 -  return left;
 -}
 diff --git a/works/life/cpp-practicum/Vendor.hpp b/works/life/cpp-practicum/Vendor.hpp deleted file mode 100644 index 24c22ee..0000000 --- a/works/life/cpp-practicum/Vendor.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once
 -#include "Base.hpp"
 -
 -#include <QTextStream>
 -#include <string>
 -
 -class Vendor final {
 -public:
 -  Vendor() = default;
 -  Vendor(int id, std::u16string name, std::u16string type,
 -         std::u16string address, std::u16string phone)
 -      : id_(id), name_(std::move(name)), type_(std::move(type)),
 -        address_(std::move(address)), phone_(std::move(phone)) {}
 -
 -  CRU_DEFAULT_COPY(Vendor)
 -  CRU_DEFAULT_MOVE(Vendor)
 -
 -  ~Vendor() = default;
 -
 -public:
 -  int GetId() const { return id_; }
 -  void SetId(int id) { id_ = id; }
 -
 -  std::u16string GetName() const { return name_; }
 -  void SetName(std::u16string name) { name_ = std::move(name); }
 -
 -  std::u16string GetType() const { return type_; }
 -  void SetType(std::u16string type) { type_ = std::move(type); }
 -
 -  std::u16string GetAddress() const { return address_; }
 -  void SetAddress(std::u16string address) { address_ = std::move(address); }
 -
 -  std::u16string GetPhone() const { return phone_; }
 -  void SetPhone(std::u16string phone) { phone_ = std::move(phone); }
 -
 -private:
 -  int id_;
 -  std::u16string name_;
 -  std::u16string type_;
 -  std::u16string address_;
 -  std::u16string phone_;
 -};
 -
 -QTextStream &operator>>(QTextStream &left, Vendor &right);
 -QTextStream &operator<<(QTextStream &left, const Vendor &right);
 diff --git a/works/life/cpp-practicum/main.cpp b/works/life/cpp-practicum/main.cpp deleted file mode 100644 index 399c82c..0000000 --- a/works/life/cpp-practicum/main.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "Record.hpp"
 -
 -#include <QApplication>
 -#include <QDir>
 -#include <QFile>
 -#include <QHBoxLayout>
 -#include <QHeaderView>
 -#include <QMainWindow>
 -#include <QPushButton>
 -#include <QTableView>
 -#include <QVBoxLayout>
 -#include <QWidget>
 -#include <memory>
 -
 -int main(int argc, char *argv[]) {
 -  QApplication application(argc, argv);
 -
 -  Record record;
 -
 -  QDir app_dir(application.applicationDirPath());
 -  QFile data_file = app_dir.filePath("data.txt");
 -  std::unique_ptr<QTextStream> stream;
 -  if (data_file.exists()) {
 -    data_file.open(QFile::ReadWrite);
 -    stream.reset(new QTextStream(&data_file));
 -    stream->setCodec("UTF-8");
 -    try {
 -      record.ReadFrom(*stream);
 -    } catch (...) {
 -    }
 -  } else {
 -    data_file.open(QFile::ReadWrite);
 -    stream.reset(new QTextStream(&data_file));
 -    stream->setCodec("UTF-8");
 -  }
 -
 -  QWidget window;
 -  QVBoxLayout window_layout;
 -  window.setLayout(&window_layout);
 -
 -  QHBoxLayout center_area;
 -  window_layout.addLayout(¢er_area);
 -
 -  QVBoxLayout book_area;
 -  QVBoxLayout vendor_area;
 -  center_area.addLayout(&book_area);
 -  center_area.addLayout(&vendor_area);
 -
 -  QHBoxLayout book_top_area;
 -  QHBoxLayout vendor_top_area;
 -  book_area.addLayout(&book_top_area);
 -  vendor_area.addLayout(&vendor_top_area);
 -
 -  QPushButton book_add_button(QStringLiteral("添加"));
 -  QPushButton book_remove_button(QStringLiteral("删除"));
 -
 -  book_top_area.addStretch(1);
 -  book_top_area.addWidget(&book_add_button);
 -  book_top_area.addWidget(&book_remove_button);
 -
 -  QPushButton vendor_add_button(QStringLiteral("添加"));
 -  QPushButton vendor_remove_button(QStringLiteral("删除"));
 -
 -  vendor_top_area.addStretch(1);
 -  vendor_top_area.addWidget(&vendor_add_button);
 -  vendor_top_area.addWidget(&vendor_remove_button);
 -
 -  QTableView book_view;
 -  book_view.verticalHeader()->hide();
 -  book_view.setSelectionBehavior(QAbstractItemView::SelectRows);
 -  book_view.setEditTriggers(QAbstractItemView::DoubleClicked);
 -  book_view.setSelectionMode(QAbstractItemView::SingleSelection);
 -  book_view.setSortingEnabled(true);
 -
 -  QTableView vendor_view;
 -  vendor_view.verticalHeader()->hide();
 -  vendor_view.setSelectionBehavior(QAbstractItemView::SelectRows);
 -  vendor_view.setEditTriggers(QAbstractItemView::DoubleClicked);
 -  vendor_view.setSelectionMode(QAbstractItemView::SingleSelection);
 -
 -  book_area.addWidget(&book_view, 1);
 -  vendor_area.addWidget(&vendor_view, 1);
 -
 -  BookModel book_model(&record);
 -  VendorModel vendor_model(&record);
 -
 -  book_view.setModel(&book_model);
 -  vendor_view.setModel(&vendor_model);
 -
 -  QObject::connect(&book_add_button, &QPushButton::clicked, [&book_model]() {
 -    book_model.insertRow(book_model.rowCount());
 -  });
 -
 -  QObject::connect(
 -      &book_remove_button, &QPushButton::clicked, [&book_view, &book_model]() {
 -        auto selected_rows = book_view.selectionModel()->selectedRows();
 -        for (const auto &row : selected_rows) {
 -          book_model.removeRow(row.row());
 -        }
 -      });
 -
 -  QObject::connect(
 -      &vendor_add_button, &QPushButton::clicked,
 -      [&vendor_model]() { vendor_model.insertRow(vendor_model.rowCount()); });
 -
 -  QObject::connect(&vendor_remove_button, &QPushButton::clicked,
 -                   [&vendor_view, &vendor_model]() {
 -                     auto selected_rows =
 -                         vendor_view.selectionModel()->selectedRows();
 -                     for (const auto &row : selected_rows) {
 -                       vendor_model.removeRow(row.row());
 -                     }
 -                   });
 -
 -  window.show();
 -
 -  int result = application.exec();
 -
 -  record.WriteTo(*stream);
 -
 -  return result;
 -}
 diff --git a/works/life/cpp-practicum/vcpkg.json b/works/life/cpp-practicum/vcpkg.json deleted file mode 100644 index 30e99f4..0000000 --- a/works/life/cpp-practicum/vcpkg.json +++ /dev/null @@ -1,6 +0,0 @@ -{
 -  "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
 -  "name": "cpp-praticum",
 -  "version": "0.0.1",
 -  "dependencies": ["ms-gsl", "qt5"]
 -}
 | 
