storj.io/uplink@v1.13.0/private/eestream/rs.go (about)

     1  // Copyright (C) 2019 Storj Labs, Inc.
     2  // See LICENSE for copying information.
     3  
     4  package eestream
     5  
     6  import (
     7  	"storj.io/common/sync2/race2"
     8  	"storj.io/infectious"
     9  )
    10  
    11  type rsScheme struct {
    12  	fc               *infectious.FEC
    13  	erasureShareSize int
    14  }
    15  
    16  // NewRSScheme returns a Reed-Solomon-based ErasureScheme.
    17  func NewRSScheme(fc *infectious.FEC, erasureShareSize int) ErasureScheme {
    18  	return &rsScheme{fc: fc, erasureShareSize: erasureShareSize}
    19  }
    20  
    21  func (s *rsScheme) EncodeSingle(input, output []byte, num int) (err error) {
    22  	return s.fc.EncodeSingle(input, output, num)
    23  }
    24  
    25  func (s *rsScheme) Encode(input []byte, output func(num int, data []byte)) (
    26  	err error) {
    27  	return s.fc.Encode(input, func(s infectious.Share) {
    28  		output(s.Number, s.Data)
    29  	})
    30  }
    31  
    32  func (s *rsScheme) Decode(out []byte, in []infectious.Share) ([]byte, error) {
    33  	for _, share := range in {
    34  		race2.ReadSlice(share.Data)
    35  	}
    36  	race2.WriteSlice(out)
    37  	return s.fc.Decode(out, in)
    38  }
    39  
    40  func (s *rsScheme) Rebuild(in []infectious.Share, out func(infectious.Share)) error {
    41  	for _, v := range in {
    42  		race2.ReadSlice(v.Data)
    43  	}
    44  	return s.fc.Rebuild(in, out)
    45  }
    46  
    47  func (s *rsScheme) ErasureShareSize() int {
    48  	return s.erasureShareSize
    49  }
    50  
    51  func (s *rsScheme) StripeSize() int {
    52  	return s.erasureShareSize * s.fc.Required()
    53  }
    54  
    55  func (s *rsScheme) TotalCount() int {
    56  	return s.fc.Total()
    57  }
    58  
    59  func (s *rsScheme) RequiredCount() int {
    60  	return s.fc.Required()
    61  }