src/Sim/Op/OpArray/OpArray.cpp

説明を見る。
00001 // 
00002 // Copyright (c) 2005-2008 Kenichi Watanabe.
00003 // Copyright (c) 2005-2008 Yasuhiro Watari.
00004 // Copyright (c) 2005-2008 Hironori Ichibayashi.
00005 // Copyright (c) 2008-2009 Kazuo Horio.
00006 // Copyright (c) 2009-2013 Naruki Kurata.
00007 // Copyright (c) 2005-2013 Ryota Shioya.
00008 // Copyright (c) 2005-2013 Masahiro Goshima.
00009 // 
00010 // This software is provided 'as-is', without any express or implied
00011 // warranty. In no event will the authors be held liable for any damages
00012 // arising from the use of this software.
00013 // 
00014 // Permission is granted to anyone to use this software for any purpose,
00015 // including commercial applications, and to alter it and redistribute it
00016 // freely, subject to the following restrictions:
00017 // 
00018 // 1. The origin of this software must not be misrepresented; you must not
00019 // claim that you wrote the original software. If you use this software
00020 // in a product, an acknowledgment in the product documentation would be
00021 // appreciated but is not required.
00022 // 
00023 // 2. Altered source versions must be plainly marked as such, and must not be
00024 // misrepresented as being the original software.
00025 // 
00026 // 3. This notice may not be removed or altered from any source
00027 // distribution.
00028 // 
00029 // 
00030 
00031 
00032 #include <pch.h>
00033 
00034 #include "Sim/Op/OpArray/OpArray.h"
00035 #include "Sim/Op/Op.h"
00036 
00037 #include "Utility/RuntimeError.h"
00038 
00039 using namespace Onikiri;
00040 
00041 // --
00042 OpArray::ArrayID::~ArrayID()
00043 {
00044     delete m_op;
00045 }
00046 
00047 // --
00048 OpArray::OpArray(int capacity) : 
00049     m_capacity(capacity)
00050 {
00051     // Op m
00052     for(int k = 0; k < m_capacity; ++k) {
00053         // ArrayID (_Op0)
00054         ArrayID* arrayID = new ArrayID(0, this, k);
00055         // arrayID p op 
00056         Op* op = new Op( OpIterator(arrayID) );
00057         // arrayID  op Zbg
00058         arrayID->SetOp(op);
00059             
00060         m_body.push_back(arrayID);
00061     }
00062 
00063     // gptO
00064     m_alive.resize(m_capacity, false);
00065     
00066     // free list 
00067     m_freeList.reserve(m_capacity);
00068     for(int k = 0; k < m_capacity; ++k) {
00069         m_freeList.push_back(k);
00070     }
00071 }
00072 
00073 OpArray::~OpArray()
00074 {
00075     for(int k = 0; k < m_capacity; ++k) {
00076         delete m_body[k];
00077     }
00078     m_body.clear();
00079 }
00080 
00081 OpIterator OpArray::CreateOp()
00082 {
00083     if( IsFull() ) {
00084         THROW_RUNTIME_ERROR("OpArray is full.(increase Core/@OpArrayCapacity)");
00085     }
00086     // free list 
00087     ID id = m_freeList.back();
00088 
00089     // free list  pop
00090     m_freeList.pop_back();
00091 
00092     // gptO
00093     ASSERT( 
00094         !IsAlive(id),
00095         "alive id reused.(id = %d)",
00096         id
00097     );
00098     m_alive[id] = true;
00099 
00100     // idIWiOpIterator
00101     return OpIterator(m_body[id]);
00102 }
00103 
00104 void OpArray::ReleaseOp(const OpIterator& opIterator)
00105 {
00106     ID id = opIterator.GetID();
00107 
00108     ASSERT(
00109         IsAlive(opIterator),
00110         "not alive op released.(id = %d)",
00111         id
00112     );
00113     // tO
00114     m_alive[id] = false;
00115     m_freeList.push_back(id);
00116 }
00117 
00118 bool OpArray::IsAlive(const OpIterator& opIterator) const
00119 {
00120     return IsAlive( opIterator.GetID() ); 
00121 }

Onikiri2に対してTue Jun 18 14:34:24 2013に生成されました。  doxygen 1.4.7