16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_SOURCE_H
186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_SOURCE_H
196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream>
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
22a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#include <tuple>
236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLineColumn;
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLine;
286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/**
306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents a file on disk. Used for logging and
316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * showing errors.
326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Source {
346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::string path;
356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    inline SourceLine line(size_t line) const;
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/**
406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents a file on disk and a line number in that file.
416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Used for logging and showing errors.
426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLine {
446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::string path;
456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    size_t line;
466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    inline SourceLineColumn column(size_t column) const;
486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/**
516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Represents a file on disk and a line:column number in that file.
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Used for logging and showing errors.
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct SourceLineColumn {
556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::string path;
566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    size_t line;
576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    size_t column;
586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski//
616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski// Implementations
626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski//
636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiSourceLine Source::line(size_t line) const {
656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return SourceLine{ path, line };
666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiSourceLineColumn SourceLine::column(size_t column) const {
696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return SourceLineColumn{ path, line, column };
706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const Source& source) {
736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return out << source.path;
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const SourceLine& source) {
776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return out << source.path << ":" << source.line;
786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const SourceLineColumn& source) {
816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return out << source.path << ":" << source.line << ":" << source.column;
826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
84a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskiinline bool operator<(const SourceLine& lhs, const SourceLine& rhs) {
85a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski    return std::tie(lhs.path, lhs.line) < std::tie(rhs.path, rhs.line);
86a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski}
87a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_SOURCE_H
91