libs/EDoc/FunctionTypeLoc.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 
00003    Copyright (C) 2007 by Brendon Costa
00004 
00005    This library is free software; you can redistribute it and/or modify 
00006    it under the terms of the "LGPL Like" License defined in the file COPYING 
00007    that should have been distributed along with this source.
00008 
00009    This library is distributed in the hope that it will be useful, 
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of 
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013    You should have received a copy of the "LGPL Like" License 
00014    along with this library; see the file COPYING. if not, it can be 
00015    obtained from the EDoc++ website: 
00016    http://edoc.sourceforge.net/license.html
00017 
00018 *******************************************************************************/
00019 #include "config.h"
00020 
00021 #include "EDoc/FunctionTypeLoc.h"
00022 #include "EDoc/FunctionType.h"
00023 #include "EDoc/Dictionary.h"
00024 #include "EDoc/PStack.h"
00025 #include "EDoc/StackRef.h"
00026 
00027 #include "EDoc/PersistenceIFace.h"
00028 #include "IndexedDictionary.h"
00029 #include "EDoc/persistence_data.h"
00030 
00031 namespace EDoc
00032 {
00033    //===========================================================================
00034    FunctionTypeLoc::FunctionTypeLoc(Dictionary& dict_in, 
00035          FunctionType* value_in, const Location& loc_in) :
00036 
00037       DictionarySpecific(&dict_in),
00038       loc(loc_in, dict_in),
00039       value(NULL)
00040    {
00041       if (value_in)
00042       {
00043          value = dict.function_types.AlwaysGet(*value_in);
00044       }
00045    }
00046    //===========================================================================
00047    FunctionTypeLoc::FunctionTypeLoc(Dictionary* dict_in) :
00048       DictionarySpecific(dict_in),
00049       loc(dict_in),
00050       value(NULL)
00051    {
00052    }
00053    //===========================================================================
00054    FunctionTypeLoc::FunctionTypeLoc(const FunctionTypeLoc& right) :
00055       DictionarySpecific(&right.dict),
00056       loc(right.loc),
00057       value(right.value)
00058    {
00059    }
00060    //===========================================================================
00061    FunctionTypeLoc::FunctionTypeLoc(const FunctionTypeLoc& right, 
00062          Dictionary& dict_in) :
00063 
00064       DictionarySpecific(&dict_in),
00065       loc(right.loc, dict_in),
00066       value(NULL)
00067    {
00068       if (right.value)
00069       {
00070          value = dict.function_types.AlwaysGet(*right.value);
00071       }
00072    }
00073    //===========================================================================
00074    FunctionTypeLoc& FunctionTypeLoc::operator=(const FunctionTypeLoc& right)
00075    {
00076       if (this == &right)
00077       {
00078          return *this;
00079       }
00080       
00081       value = NULL;
00082       if (right.value)
00083       {
00084          value = dict.function_types.AlwaysGet(*right.value);
00085       }
00086       
00087       return *this;
00088    }
00089    //===========================================================================
00090    void FunctionTypeLoc::Read(PersistenceIFace& file, IndexedDictionary& idict)
00091    {
00092       // Item then location.
00093       value = idict.function_types.AlwaysGet(
00094          file.ReadUInt32(KEY_FUNCTION_TYPE));
00095       
00096       loc.Read(file, idict);
00097    }
00098    //===========================================================================
00099    void FunctionTypeLoc::Write(PersistenceIFace& file) const
00100    {
00101       // Item then location.
00102       file.WriteUInt32Debug(KEY_FUNCTION_TYPE, 
00103          value->GetIndex(), value->GetDeclaredName());
00104       
00105       loc.Write(file);
00106    }
00107    //===========================================================================
00108    bool FunctionTypeLoc::operator==(const FunctionTypeLoc& right) const
00109    {
00110       return (loc == right.loc) && 
00111          (value->GetNormalisedName() == right.value->GetNormalisedName());
00112    }
00113    //===========================================================================
00114    //@@@Brendon Possibly use special C++ type conversion functions.
00115    #define EDOC_REPLACE(DataType, Data, From, To, Count) \
00116       if ((void*)Data == From) {Data = (DataType*)To; Count++;}
00117    //===========================================================================
00118    size_t FunctionTypeLoc::ReplaceReferences(PStack& stack, void* remove, 
00119       void* replace)
00120    {
00121       size_t count = 0;
00122       if (!stack.Push(this))
00123       {
00124          return count;
00125       }
00126 
00127       // Dont replace recursivly. Only replace inside us.
00128       EDOC_REPLACE(FunctionType, value, remove, replace, count);
00129 
00130       count += loc.ReplaceReferences(stack, remove, replace);
00131       
00132       return count;
00133    }
00134    //===========================================================================
00135    void FunctionTypeLoc::Validate(PStack& stack, 
00136       const Dictionary& dict_in) const
00137    {
00138       StackRef ref(stack, this);
00139       if (!ref)
00140       {
00141          return;
00142       }
00143       
00144       EDOC_ASSERT(&dict == &dict_in, "");
00145       
00146       loc.Validate(stack, dict_in);
00147       value->Validate(stack, dict_in);
00148    }
00149    //===========================================================================
00150    std::ostream& FunctionTypeLoc::Print(std::ostream& out, 
00151       std::string prefix) const
00152    {
00153       // Print the location first
00154       loc.Print(out, prefix);
00155       
00156       // Then the functions key.
00157       out << prefix << "Function Type: " << value->GetKeyName() << std::endl;
00158       return out;
00159    }
00160    //===========================================================================
00161 }
00162 

Generated on Tue Jan 20 18:26:07 2009 for EDoc-0.2.1 by  doxygen 1.5.1