diff options
Diffstat (limited to 'afdpageaddress.cc')
-rw-r--r-- | afdpageaddress.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/afdpageaddress.cc b/afdpageaddress.cc new file mode 100644 index 0000000..708dcef --- /dev/null +++ b/afdpageaddress.cc @@ -0,0 +1,61 @@ +#include <QtCore/QDebug> +#include <QtCore/QStringList> +#include "afdpageaddress.h" + +namespace { +quint64 addressToUint64(uint section, uint segment, uint shelf, uint book, uint page) +{ + return quint64(section & 0xFFFU) << 52 | + quint64(segment & 0xFFFU) << 40 | quint64(shelf & 0xFFFFU) << 24 | + quint64(book & 0xFFFU) << 12 | quint64(page & 0xFFFU); +} +} + +AfdPageAddress::AfdPageAddress(uint section, uint segment, uint shelf, uint book, uint page) + : v(addressToUint64(section, segment, shelf, book, page)) +{ +} + +AfdPageAddress::AfdPageAddress(uint segment, uint shelf, uint book, uint page) + : v(addressToUint64(0, segment, shelf, book, page)) +{ +} + +AfdPageAddress::AfdPageAddress(const QString &addr) +{ + uint section, segment, shelf, book, page; + QStringList parts = addr.split('.'); + if (parts.count() == 5) { + section = parts[0].toUInt(); + segment = parts[1].toUInt(); + shelf = parts[2].toUInt(); + book = parts[3].toUInt(); + page = parts[4].toUInt(); + } else if (parts.count() == 4) { + section = 0; + segment = parts[0].toUInt(); + shelf = parts[1].toUInt(); + book = parts[2].toUInt(); + page = parts[3].toUInt(); + } else { + qWarning() << "Unknown page address syntax:" << addr; + } + v = addressToUint64(section, segment, shelf, book, page); +} + +QString AfdPageAddress::toString() const +{ + QStringList l; + l.reserve(5); + + if (section()) { + l.append(QString::number(section())); + } + + l.append(QString::number(segment())); + l.append(QString::number(shelf())); + l.append(QString::number(book())); + l.append(QString::number(page())); + + return l.join("."); +} |