diff options
author | Brian Silver <bsilver@us.ibm.com> | 2015-03-25 09:10:22 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2015-12-11 13:40:20 -0600 |
commit | 8fa4f53e50e2c7de8e21253781a375e02ca6e37f (patch) | |
tree | 64cf86f0a148fd5e567a6083895312a7325bc562 /src/import/hwpf/fapi2/src | |
parent | 107699b434361d0b592e42b2928347b5a281b1b6 (diff) | |
download | talos-hostboot-8fa4f53e50e2c7de8e21253781a375e02ca6e37f.tar.gz talos-hostboot-8fa4f53e50e2c7de8e21253781a375e02ca6e37f.zip |
Add fapi2::array
Change-Id: Ieddede5e9678b9bac1cc4b59a74d2a3f3a817afd
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16619
Reviewed-by: Thi N. Tran <thi@us.ibm.com>
Reviewed-by: Matt K. Light <mklight@us.ibm.com>
Reviewed-by: James N. Klazynski <jklazyns@us.ibm.com>
Reviewed-by: Brian Silver <bsilver@us.ibm.com>
Tested-by: Brian Silver <bsilver@us.ibm.com>
Diffstat (limited to 'src/import/hwpf/fapi2/src')
-rw-r--r-- | src/import/hwpf/fapi2/src/array.C | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/src/import/hwpf/fapi2/src/array.C b/src/import/hwpf/fapi2/src/array.C new file mode 100644 index 000000000..99a57bdec --- /dev/null +++ b/src/import/hwpf/fapi2/src/array.C @@ -0,0 +1,131 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* 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. */ +/* */ +/* IBM_PROLOG_END_TAG */ +/** + * @file array.C + * @brief fapi2 arrays + */ + +#include <stdint.h> +#include <array.H> + +namespace fapi2 +{ + /// @brief Create an array + array::array(const uint32_t i_size, element_type* i_data): + iv_size(i_size), + iv_data(i_data) + { + assert(iv_size <= size_limit); + if (iv_data == nullptr) + { + iv_data = new element_type[iv_size](); + iv_size |= delete_bit; + } + // If the caller passed in a pointer, leave it be. Don't + // initialize it or anything. That will allow a placement + // operation where generic memory can use fapi2::array + // methods without much overhead. + } + + /// @brief Destroy an array + array::~array(void) + { + if ((iv_size & delete_bit) != 0) + { + delete[] iv_data; + } + } + + /// @brief operator[] + array::element_type& array::operator[](const uint32_t i_index) + { + assert(i_index < size()); + return iv_data[i_index]; + } + + /// @brief operator=() + array& array::operator=(const array& i_other) + { + // Check to make sure it'll fit. + assert(i_other.size() <= size()); + + // Our new size will be the other's size. + // Save of whether we should delete our iv_data ... + uint64_t l_our_delete_state = iv_size | delete_bit; + + // ... our new size is the size (minus the delete state) of i_other + iv_size = i_other.size(); + + // ... do the copy ... + memcpy(iv_data, i_other.iv_data, iv_size * sizeof(element_type)); + + // ... and record our old delete state. + iv_size |= l_our_delete_state; + + return *this; + } + + /// @brief move operator=() + array& array::operator=(array&& i_other) + { + iv_size = i_other.iv_size; + + // Make sure to clear the delete bit in the other. We + // don't want our memory to be deleted. + i_other.iv_size = i_other.size(); + + iv_data = std::move(i_other.iv_data); + return *this; + } + + /// @brief operator==() + bool array::operator==(const array& i_other) + { + // If they're not the same size, they're not the same + if (size() != i_other.size()) + { + return false; + } + + // If they're the same size and point to the same memory, they're the same. + if (iv_data == i_other.iv_data) + { + return true; + } + + auto oitr = i_other.begin(); + auto iter = begin(); + + for(; iter != end(); ++iter, ++oitr) + { + if (*iter != *oitr) + { + return false; + } + } + + return true; + } +} |