libs/EDoc/TypeLoc.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/TypeLoc.h"
00022 #include "EDoc/Type.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    TypeLoc::TypeLoc(Dictionary* dict_in) :
00035       DictionarySpecific(dict_in),
00036       loc(dict_in),
00037       value(NULL)
00038    {
00039    }
00040    //===========================================================================
00041    TypeLoc::TypeLoc(const TypeLoc& right) :
00042       DictionarySpecific(&right.dict),
00043       loc(right.loc),
00044       value(right.value)
00045    {
00046    }
00047    //===========================================================================
00048    TypeLoc::TypeLoc(const TypeLoc& right, Dictionary& dict_in) :
00049       DictionarySpecific(&dict_in),
00050       loc(right.loc, dict_in),
00051       value(NULL)
00052    {
00053       if (right.value)
00054       {
00055          value = dict.types.AlwaysGet(*right.value);
00056       }
00057    }
00058    //===========================================================================
00059    TypeLoc& TypeLoc::operator=(const TypeLoc& right)
00060    {
00061       if (this == &right)
00062       {
00063          return *this;
00064       }
00065       
00066       value = NULL;
00067       if (right.value)
00068       {
00069          value = dict.types.AlwaysGet(*right.value);
00070       }
00071       
00072       return *this;
00073    }
00074    //===========================================================================
00075    void TypeLoc::Read(PersistenceIFace& file, IndexedDictionary& idict)
00076    {
00077       // Item then location.
00078       value = idict.types.AlwaysGet(file.ReadUInt32(KEY_TYPE));
00079       
00080       loc.Read(file, idict);
00081    }
00082    //===========================================================================
00083    void TypeLoc::Write(PersistenceIFace& file) const
00084    {
00085       // Item then location.
00086       file.WriteUInt32Debug(KEY_TYPE, 
00087          value->GetIndex(), value->GetDeclaredName());
00088       
00089       loc.Write(file);
00090    }
00091    //===========================================================================
00092    bool TypeLoc::operator==(const TypeLoc& right) const
00093    {
00094       return (loc == right.loc) && 
00095          (value->GetNormalisedName() == right.value->GetNormalisedName());
00096    }
00097    //===========================================================================
00098    //@@@Brendon Possibly use special C++ type conversion functions.
00099    #define EDOC_REPLACE(DataType, Data, From, To, Count) \
00100       if ((void*)Data == From) {Data = (DataType*)To; Count++;}
00101    //===========================================================================
00102    size_t TypeLoc::ReplaceReferences(PStack& stack, void* remove, 
00103       void* replace)
00104    {
00105       size_t count = 0;
00106       if (!stack.Push(this))
00107       {
00108          return count;
00109       }
00110 
00111       // Dont replace recursivly. Only replace inside us.
00112       EDOC_REPLACE(Type, value, remove, replace, count);
00113 
00114       count += loc.ReplaceReferences(stack, remove, replace);
00115       
00116       return count;
00117    }
00118    //===========================================================================
00119    void TypeLoc::Validate(PStack& stack, const Dictionary& dict_in) const
00120    {
00121       StackRef ref(stack, this);
00122       if (!ref)
00123       {
00124          return;
00125       }
00126       
00127       EDOC_ASSERT(&dict == &dict_in, "");
00128       
00129       loc.Validate(stack, dict_in);
00130       value->Validate(stack, dict_in);
00131    }
00132    //===========================================================================
00133    std::ostream& TypeLoc::Print(std::ostream& out, std::string prefix) const
00134    {
00135       // Print the location first
00136       loc.Print(out, prefix);
00137       
00138       // Then the types key.
00139       out << prefix << "Type: " << value->GetKeyName() << std::endl;
00140       return out;
00141    }
00142    //===========================================================================
00143 }
00144 
00145 

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