#include <QString>
#include <QTime>
#include <QDebug>
#include <string>

void benchCharArrayRead()
{
    QTime time;
    wchar_t s[200];
    QChar tmp;

    for (int i = 0; i < 200; i++) {
        s[i] = ' ';
    }

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            tmp = s[i];
        }
    }
    qDebug() << "benchCharArrayRead" << time.elapsed();
}

void benchQStringRead()
{
    QTime time;
    QString s(200, ' ');
    QChar tmp;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            tmp = s[i];
        }
    }
    qDebug() << "benchQStringRead" << time.elapsed();
}

void benchWStringRead()
{
    QTime time;
    std::wstring s(200, ' ');
    wchar_t c;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            c = s[i];
        }
    }
    qDebug() << "benchWStringRead" << time.elapsed();
}

void benchStringRead()
{
    QTime time;
    std::string s(200, ' ');
    char c;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            c = s[i];
        }
    }
    qDebug() << "benchStringRead" << time.elapsed();
}

void benchCharArrayWrite()
{
    QTime time;
    wchar_t s[200];
    wchar_t c = 'x';

    for (int i = 0; i < 200; i++) {
        s[i] = ' ';
    }

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            s[i] = c;
        }
    }
    qDebug() << "benchCharArrayWrite" << time.elapsed();
}

void benchQStringWrite()
{
    QTime time;
    QString s(200, ' ');
    QChar c = 'x';

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            s[i] = c;
        }
    }
    qDebug() << "benchQStringWrite" << time.elapsed();
}

void benchWStringWrite()
{
    QTime time;
    std::wstring s(200, ' ');
    wchar_t c = 'x';

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            s[i] = c;
        }
    }
    qDebug() << "benchWStringWrite" << time.elapsed();
}

void benchStringWrite()
{
    QTime time;
    std::wstring s(200, ' ');
    char c = 'x';

    time.start();
    for (int j = 0; j < 10000000; j++) {
        for (int i = 0; i < 200; i++) {
            s[i] = c;
        }
    }
    qDebug() << "benchStringWrite" << time.elapsed();
}

void benchCharArrayCopy()
{
    QTime time;
    wchar_t s[200], s2[200];

    for (int i = 0; i < 200; i++) {
        s[i] = ' ';
    }

    time.start();
    for (int j = 0; j < 10000000; j++) {
        memcpy(s2, s, sizeof(wchar_t) * 200);
    }
    qDebug() << "benchCharArrayCopy" << time.elapsed();
}

void benchCharPtrCopy()
{
    QTime time;
    wchar_t s[200], *s2;

    for (int i = 0; i < 200; i++) {
        s[i] = ' ';
    }

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
    }
    qDebug() << "benchCharPtrCopy" << time.elapsed();
}

void benchQStringCopy()
{
    QTime time;
    QString s(200, ' '), s2;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
    }
    qDebug() << "benchQStringCopy" << time.elapsed();
}

void benchWStringCopy()
{
    QTime time;
    std::wstring s(200, ' '), s2;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
    }
    qDebug() << "benchWStringCopy" << time.elapsed();
}

void benchStringCopy()
{
    QTime time;
    std::string s(200, ' '), s2;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
    }
    qDebug() << "benchStringCopy" << time.elapsed();
}

void benchQStringCopyWrite()
{
    QTime time;
    QString s(200, ' '), s2;
    QChar c = 'x';

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        for (int i = 0; i < 200; i++) {
            s2[i] = c;
        }
    }
    qDebug() << "benchQStringCopyWrite" << time.elapsed();
}

void benchWStringCopyWrite()
{
    QTime time;
    std::wstring s(200, ' '), s2;
    wchar_t c = 'x';

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        for (int i = 0; i < 200; i++) {
            s2[i] = c;
        }
    }
    qDebug() << "benchWStringCopyWrite" << time.elapsed();
}

void benchStringCopyWrite()
{
    QTime time;
    std::string s(200, ' '), s2;
    char c = 'x';

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        for (int i = 0; i < 200; i++) {
            s2[i] = c;
        }
    }
    qDebug() << "benchStringCopyWrite" << time.elapsed();
}

void benchQStringCopyRead()
{
    QTime time;
    QString s(200, ' '), s2;
    QChar c;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        for (int i = 0; i < 200; i++) {
            c = s2[i];
        }
    }
    qDebug() << "benchQStringCopyRead" << time.elapsed();
}

void benchWStringCopyRead()
{
    QTime time;
    std::wstring s(200, ' '), s2;
    wchar_t c;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        for (int i = 0; i < 200; i++) {
            c = s2[i];
        }
    }
    qDebug() << "benchWStringCopyRead" << time.elapsed();
}

void benchStringCopyRead()
{
    QTime time;
    std::string s(200, ' '), s2;
    char c;

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        for (int i = 0; i < 200; i++) {
            c = s2[i];
        }
    }
    qDebug() << "benchStringCopyRead" << time.elapsed();
}

void benchQStringCopyAppend()
{
    QTime time;
    QString s(200, ' '), s2, s3(2, 'y');

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        s2 += s3;
    }
    qDebug() << "benchQStringCopyAppend" << time.elapsed();
}

void benchWStringCopyAppend()
{
    QTime time;
    std::wstring s(200, ' '), s2, s3(2, 'y');

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        s2 += s3;
    }
    qDebug() << "benchWStringCopyAppend" << time.elapsed();
}

void benchStringCopyAppend()
{
    QTime time;
    std::string s(200, ' '), s2, s3(2, 'y');

    time.start();
    for (int j = 0; j < 10000000; j++) {
        s2 = s;
        s2 += s3;
    }
    qDebug() << "benchStringCopyAppend" << time.elapsed();
}

int main(int, char **)
{
    benchCharArrayRead();
    benchQStringRead();
    benchWStringRead();
    benchStringRead();

    benchCharArrayWrite();
    benchQStringWrite();
    benchWStringWrite();
    benchStringWrite();

    benchCharPtrCopy();
    benchCharArrayCopy();
    benchQStringCopy();
    benchWStringCopy();
    benchStringCopy();

    benchQStringCopyRead();
    benchWStringCopyRead();
    benchStringCopyRead();

    benchQStringCopyWrite();
    benchWStringCopyWrite();
    benchStringCopyWrite();

    benchQStringCopyAppend();
    benchWStringCopyAppend();
    benchStringCopyAppend();

    return 1;
}
