20#include "pedigree/kernel/compiler.h"
21#include "pedigree/kernel/processor/types.h"
22#include "pedigree/kernel/utilities/Cord.h"
23#include "pedigree/kernel/utilities/List.h"
24#include "pedigree/kernel/utilities/String.h"
26Cord::Cord() =
default;
28Cord::Cord(
const Cord& other) :
Cord() {
36Cord& Cord::operator=(
const Cord& s) {
42 m_Segments.reserve(segments,
true);
45void Cord::assign(
const Cord& other) {
51 m_Segments.reserve(other.m_Segments.count(),
false);
53 for (
auto& it : other.m_Segments) {
54 m_Segments.pushBack(it);
55 m_Length += it.length;
60 m_Segments.clear(
false);
64size_t Cord::length()
const {
68String Cord::toString()
const {
69 char* buf =
new char[m_Length + 1];
71 for (
auto& it : m_Segments) {
72 MemoryCopy(buf + offset, it.ptr, it.length);
78 String result(buf, m_Length);
85 for (
auto& it : m_Segments) {
86 if ((index >= i) && (index < (i + it.length))) {
87 return it.ptr[index - i];
97void Cord::append(
const char* s,
size_t len) {
99 len = StringLength(s);
105 m_Segments.pushBack(CordSegment(s, len));
109void Cord::prepend(
const char* s,
size_t len) {
111 len = StringLength(s);
117 m_Segments.pushFront(CordSegment(s, len));
122 append(str.cstr(), str.length());
125void Cord::prepend(
const String& str) {
126 prepend(str.cstr(), str.length());
145Cord::CordIterator::CordIterator(
const Cord& owner) : cord(owner), segment(0), index(0) {
146 segptr = cord.m_Segments.count() ? &cord.m_Segments[segment] :
nullptr;
149Cord::CordIterator::CordIterator(
const Cord& owner,
bool end) : cord(owner), segment(0), index(0) {
150 segment = owner.m_Segments.count();
154Cord::CordIterator::~CordIterator() =
default;
161 if (index >= segptr->length) {
165 segptr = segment < cord.m_Segments.count() ? &cord.m_Segments[segment] :
nullptr;
174 }
else if (segment) {
176 segptr = &cord.m_Segments[segment];
177 index = segptr->length - 1;
183char Cord::CordIterator::operator*()
const {
184 return segptr->ptr[index];
187bool Cord::CordIterator::operator==(
const CordIterator& other)
const {
188 return segment == other.segment && index == other.index;
191bool Cord::CordIterator::operator!=(
const CordIterator& other)
const {
192 return !(*
this == other);
195Cord::CordSegmentIterator::CordSegmentIterator(
const Cord& owner) : cord(owner), segment(0) {}
197Cord::CordSegmentIterator::CordSegmentIterator(
const Cord& owner,
bool end)
198 : cord(owner), segment(0) {
199 segment = owner.m_Segments.count();
202Cord::CordSegmentIterator::~CordSegmentIterator() =
default;
207 if (segment > cord.m_Segments.count()) {
208 segment = cord.m_Segments.count();
222const char* Cord::CordSegmentIterator::ptr()
const {
223 return cord.m_Segments[segment].ptr;
226size_t Cord::CordSegmentIterator::length()
const {
227 return cord.m_Segments[segment].length;
230bool Cord::CordSegmentIterator::operator==(
const CordSegmentIterator& other)
const {
231 return segment == other.segment;
234bool Cord::CordSegmentIterator::operator!=(
const CordSegmentIterator& other)
const {
235 return !(*
this == other);
char operator[](size_t index) const
void reserve(size_t segments)