terminal/src/buffer/out/OutputCell.hpp

93 lines
2.4 KiB
C++

/*++
Copyright (c) Microsoft Corporation
Licensed under the MIT license.
Module Name:
- OutputCell.hpp
Abstract:
- Representation of all data stored in a cell of the output buffer.
- RGB color supported.
Author:
- Austin Diviness (AustDi) 20-Mar-2018
--*/
#pragma once
#include "DbcsAttribute.hpp"
#include "TextAttribute.hpp"
#include "OutputCellView.hpp"
#include <exception>
#include <variant>
class InvalidCharInfoConversionException : public std::exception
{
const char* what() noexcept
{
return "Cannot convert to CHAR_INFO without explicit TextAttribute";
}
};
class OutputCell final
{
public:
OutputCell();
OutputCell(const std::wstring_view charData,
const DbcsAttribute dbcsAttribute,
const TextAttributeBehavior behavior);
OutputCell(const std::wstring_view charData,
const DbcsAttribute dbcsAttribute,
const TextAttribute textAttribute);
OutputCell(const CHAR_INFO& charInfo);
OutputCell(const OutputCellView& view);
OutputCell(const OutputCell&) = default;
OutputCell(OutputCell&&) = default;
OutputCell& operator=(const OutputCell&) = default;
OutputCell& operator=(OutputCell&&) = default;
~OutputCell() = default;
const std::wstring_view Chars() const noexcept;
void SetChars(const std::wstring_view chars);
DbcsAttribute& DbcsAttr() noexcept;
TextAttribute& TextAttr();
constexpr const DbcsAttribute& DbcsAttr() const
{
return _dbcsAttribute;
}
const TextAttribute& TextAttr() const
{
THROW_HR_IF(E_INVALIDARG, _behavior == TextAttributeBehavior::Current);
return _textAttribute;
}
constexpr TextAttributeBehavior TextAttrBehavior() const
{
return _behavior;
}
private:
// basic_string contains a small storage internally so we don't need
// to worry about heap allocation for short strings.
std::wstring _text;
DbcsAttribute _dbcsAttribute;
TextAttribute _textAttribute;
TextAttributeBehavior _behavior;
void _setFromBehavior(const TextAttributeBehavior behavior);
void _setFromCharInfo(const CHAR_INFO& charInfo);
void _setFromStringView(const std::wstring_view view);
void _setFromOutputCellView(const OutputCellView& cell);
};