/*
 Copyright 2019 Alain Dargelas
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/* 
 * File:   LibrarySet.h
 * Author: alain
 *
 * Created on January 27, 2018, 5:28 PM
 */

#ifndef LIBRARYSET_H
#define LIBRARYSET_H
#include "Library.h"
#include <vector>

namespace SURELOG {

class LibrarySet {
public:
    LibrarySet();
    LibrarySet(const LibrarySet& orig);
    virtual ~LibrarySet();
    void addLibrary(Library& lib) { m_libraries.push_back(lib); }
    
    std::vector<Library>& getLibraries() { return m_libraries; }
    Library* getLibrary(std::string libName);
    Library* getLibrary(SymbolId fileId);
    void checkErrors(SymbolTable* symbols, ErrorContainer* errors);
    std::string report(SymbolTable* symbols);
    
    
private:
    std::vector<Library> m_libraries;
};

};

#endif /* LIBRARYSET_H */


